DAML-S
<?xml version='1.0' encoding='ISO-8859-1'?> <!DOCTYPE uridef[ <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns"> <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema"> <!ENTITY xsd "http://www.w3.org/2000/10/XMLSchema"> <!ENTITY daml "http://www.daml.org/2001/03/daml+oil"> <!ENTITY dex "http://www.daml.org/2001/03/daml+oil-ex"> <!ENTITY exd "http://www.daml.org/2001/03/daml+oil-ex-dt"> <!ENTITY service "http://www.daml.org/services/daml-s/2001/10/Service.daml"> <!ENTITY process "http://www.daml.org/services/daml-s/2001/10/Process.daml"> <!ENTITY time "http://www.ai.sri.com/~daml/ontologies/sri-basic/1-0/Time.daml"> <!ENTITY congo "http://www.daml.org/services/daml-s/2001/10/Congo.daml"> <!ENTITY DEFAULT "http://www.daml.org/services/daml-s/2001/10/Congo.daml"> <!ENTITY THIS "http://www.daml.org/services/daml-s/2001/10/Congo.daml"> ]> <rdf:RDF xmlns:rdf = "&rdf;#" xmlns:rdfs = "&rdfs;#" xmlns:xsd = "&xsd;#" xmlns:daml = "&daml;#" xmlns:dex = "&dex;#" xmlns:exd = "&exd;#" xmlns:service = "&service;#" xmlns:process = "&process;#" xmlns:time = "&time;#" xmlns = "&congo;#" > <daml:Ontology rdf:about=""> <daml:versionInfo> $Id: Congo.daml,v 1.7 2002/01/15 08:05:06 martin Exp $ </daml:versionInfo> <rdfs:comment> A B2C bookbuying example of DAML-S (DARPA Agent Markup Language for Services; see http://www.daml.org/services/) usage, illustrating a simple use of the process model. This is a sketch; not a complete example. The service described here is a book buying (or selling, depending on your perspective) service from www.congo.com. We present two forms of the service. First, there's a one-step form, with the service treated as ATOMIC; i.e., no interactions between buying and selling agents are required, apart from invocation of the service and receipt of its outputs by the buyer. Given certain inputs and parameters, the service provides certain outputs and has specific effects. Second, a full-fledged version of the service is specified, showing its composition from its component services. The atomic service is CongoBuy, which has specified inputs, outputs, preconditions and effects (IOPEs). The full-fledged version of the service, ExpandedCongoBuy, includes an arrangement of subprocesses LocateBook, PutInCart, SignIn, CreateAcct, CreateProfile, LoadProfile, SpecifyDeliveryDetails, FinalizeBuy each with its own IOPE spec. Created by Srini Narayanan (srini@ai.sri.com). Modifications by Mark Burstein, David Martin, Sheila McIlraith, Srini Narayanan, Terri Payne. </rdfs:comment> <daml:imports rdf:resource="&daml;"/> <daml:imports rdf:resource="&time;"/> <daml:imports rdf:resource="&service;"/> <daml:imports rdf:resource="&process;"/> </daml:Ontology> <!-- NOTES ON LANGUAGE USE: NOTE: This DAML code employs 2 proposed properties: daml:sameValuesAs daml:listOfInstancesOf which are not currently part of DAML+OIL. The daml:sameValuesAs property is used here only in the definitions of (IOPE) properties of composite processes (but there is nothing about daml:sameValuesAs that limits its use in this way). Input, output, precondition, and effect properties of composite processes can, in principle, be automatically generated by tools. Since such tools don't yet exist, they have been manually generated for this example. --> <!--################################################### DATA TYPES ###################################################--> <daml:Class rdf:ID="CreditCardType"> <daml:oneOf rdf:parseType="daml:collection"> <CreditCardType rdf:ID="MasterCard"/> <CreditCardType rdf:ID="VISA"/> <CreditCardType rdf:ID="AmericanExpress"/> <CreditCardType rdf:ID="DiscoverCard"/> </daml:oneOf> </daml:Class> <daml:Class rdf:ID="PackagingType"> <daml:oneOf rdf:parseType="daml:collection"> <PackagingType rdf:ID="Giftwrap"/> <PackagingType rdf:ID="Ordinary"/> </daml:oneOf> </daml:Class> <daml:Class rdf:ID="DeliveryType"> <daml:oneOf rdf:parseType="daml:collection"> <DeliveryType rdf:ID="FedExOneDay"/> <DeliveryType rdf:ID="FedEx2-3day"/> <DeliveryType rdf:ID="UPS"/> <DeliveryType rdf:ID="OrdinaryMail"/> </daml:oneOf> </daml:Class> <daml:Class rdf:ID="ValidityType"> <daml:oneOf rdf:parseType="daml:collection"> <ValidityType rdf:ID="Valid"/> <ValidityType rdf:ID="Expired"/> <ValidityType rdf:ID="InvalidCCNumber"/> <ValidityType rdf:ID="InvalidCCType"/> <ValidityType rdf:ID="AuthorizationRefused"/> </daml:oneOf> </daml:Class> <daml:Class rdf:ID="BuyEffectType"> <daml:oneOf rdf:parseType="daml:collection"> <BuyEffectType rdf:ID ="OrderShipped"/> <BuyEffectType rdf:ID ="Failure"/> </daml:oneOf> </daml:Class> <!-- stub most of these for now --> <daml:Class rdf:ID="Book"> <rdfs:subClassOf rdf:resource="&daml;#Thing"/> </daml:Class> <daml:Class rdf:ID="EReceipt"> <rdfs:subClassOf rdf:resource="&daml;#Thing"/> </daml:Class> <daml:Class rdf:ID="ShippingOrder"> <rdfs:subClassOf rdf:resource="&daml;#Thing"/> </daml:Class> <daml:Class rdf:ID="SignInData"> <rdfs:subClassOf rdf:resource="&daml;#Thing"/> </daml:Class> <rdf:Property rdf:ID="acctName"> <rdfs:domain rdf:resource="#SignInData"/> <rdfs:range rdf:resource="&xsd;#string"/> </rdf:Property> <rdf:Property rdf:ID="password"> <rdfs:domain rdf:resource="#SignInData"/> <rdfs:range rdf:resource="&xsd;#string"/> </rdf:Property> <daml:Class rdf:ID="ProfileInfo"> <rdfs:subClassOf rdf:resource="&daml;#Thing"/> </daml:Class> <daml:Class rdf:ID="AcctInfo"> <daml:unionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="#SignInData"/> <daml:Class rdf:about="#ProfileInfo"/> </daml:unionOf> </daml:Class> <daml:Class rdf:ID="ENotify"> <rdfs:subClassOf rdf:resource="&daml;#Thing"/> </daml:Class> <daml:Class rdf:ID="CreateAcctOutputType"> <daml:unionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="#AcctInfo"/> <daml:Class rdf:about="#ENotify"/> </daml:unionOf> </daml:Class> <!-- Shopping cart Holding the books is the Cart Class defined below various processes like AddToCart, RemoveFromCart, itemInCart?, etc can be defined using the Cart Class as the structure manipulated. So the ouput/effect of these processes would manipulate the cart to add, delete items. (These manipulations are not yet specified here.) --> <daml:Class rdf:ID="Cart"> <daml:intersectionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="daml:List"/> <daml:Restriction> <daml:onProperty rdf:resource="&daml;#item"/> <daml:toClass rdf:resource="#Book"/> </daml:Restriction> </daml:intersectionOf> </daml:Class> <!--################################################### THE BLACKBOX PROCESS CongoBuy ###################################################--> <daml:Class rdf:ID="CongoBuy"> <rdfs:subClassOf rdf:resource="&process;#SimpleProcess"/> </daml:Class> <!-- Inputs --> <rdf:Property rdf:ID="congoBuyBookName"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="&xsd;#string"/> </rdf:Property> <rdf:Property rdf:ID="congoBuySignInInfo"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="#SignInData"/> </rdf:Property> <!-- 2 Preconditions: AccountExists and CreditExists. The range of the preconditions is a condition object with a conditionValue property. TBD: How to indicate that the conditionValue (output) property of CreditExists holds the operative value. --> <daml:Class rdf:ID="CreditExists"> <rdfs:subClassOf rdf:resource="&process;#Condition"/> </daml:Class> <daml:Class rdf:ID="AcctExists"> <rdfs:subClassOf rdf:resource="&process;#Condition"/> </daml:Class> <rdf:Property rdf:ID="congoBuyAcctExistsPrecondition"> <rdfs:subPropertyOf rdf:resource="&process;#precondition"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="#AcctExists"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyCreditExistsPrecondition"> <rdfs:subPropertyOf rdf:resource="&process;#precondition"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="#CreditExists"/> </rdf:Property> <!-- TWO OUTPUTS, E-RECEIPT AND SHIPPING-ORDER --> <rdf:Property rdf:ID="congoBuyReceipt"> <rdfs:subPropertyOf rdf:resource="&process;#output"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="#EReceipt"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyShippingOrder"> <rdfs:subPropertyOf rdf:resource="&process;#output"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="#ShippingOrder"/> </rdf:Property> <!-- Other parameters --> <rdf:Property rdf:ID="congoBuyCreditCardValidity"> <rdfs:subPropertyOf rdf:resource="&process;#parameter"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="#ValidityType"/> </rdf:Property> <!-- THE EFFECT IS EITHER ORDERSHIPPED OR FAILURE. Conditional Effects would require an If-Then-Else range. TBD... --> <rdf:Property rdf:ID="congoBuyEffect"> <rdfs:subPropertyOf rdf:resource="&process;#effect"/> <rdfs:domain rdf:resource="#CongoBuy"/> <rdfs:range rdf:resource="#BuyEffectType"/> </rdf:Property> <!--################################################### THE COMPOSITE PROCESS: ExpandedCongoBuy (given in top-down order) ###################################################--> <!-- Now for the full-fledged book-buying process, ExpandedCongoBuy. This is more complicated since it has to specify the process schema including alternatives, conditional executions, etc. We build the class recursively in a top-down manner. The basic idea is that each CompositeProcess is composedOf a ControlConstruct, which may be a Sequence, Alternative, If-then-else, etc. Each such ConstrolConstruct, in turn, has a "components" property (a list or bag), which specifies the classes of the subcomponents of the ControlConstruct. These classes may themselves be processes or control constructs. Finally we bottom out when the components of a composite process are atomic processes. In the Congo example we assume the following basic structure for the composition. The main steps are to locate a book and to then buy it. While (for exposition) we assume that the locate book is an atomic process (without components), the buying of a book involves a sequence of subprocesses that correspond to specifying a payment method, specifying the details of delivery (address, wrapping type, etc.) and finalizing the buy process. These are the component subprocesses of the sequence corresponding to the expanded buying process. The detailed buying sequence involves a sequence of component sub-processes corresponding to putting the book into a cart, followed by a signing-in choice, followed by a method of payment selection. The signing-in choice process is itself a composite process which offers the alternatives of signing in as a new user (creating an account) or using a stored profile instead. Each of these processes is itself composite, bottoming out in a sequence of atomic processes corresponding to signing in or creating a new account/profile. --> <!-- Expand and Collapse relations for the CongoBuy Process --> <daml:Class rdf:about="#CongoBuy"> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="&process;#expand"/> <daml:toClass rdf:resource="#ExpandedCongoBuy"/> </daml:Restriction> </rdfs:subClassOf> </daml:Class> <daml:Class rdf:about="#ExpandedCongoBuy"> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="&process;#collapse"/> <daml:toClass rdf:resource="#CongoBuy"/> </daml:Restriction> </rdfs:subClassOf> </daml:Class> <!-- The top level process is a sequence whose components are an atomic process, LocateBook and a composite process CongoBuyBook --> <daml:Class rdf:ID="ExpandedCongoBuy"> <rdfs:subClassOf rdf:resource="&process;#CompositeProcess"/> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="&process;#composedOf"/> <daml:toClass> <daml:Class> <daml:intersectionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="process:Sequence"/> <daml:Restriction> <daml:onProperty rdf:resource="&process;#components"/> <daml:toClass> <daml:Class> <daml:listOfInstancesOf rdf:parseType="daml:collection"> <daml:Class rdf:about="#LocateBook"/> <daml:Class rdf:about="#CongoBuyBook"/> </daml:listOfInstancesOf> </daml:Class> </daml:toClass> </daml:Restriction> </daml:intersectionOf> </daml:Class> </daml:toClass> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#expCongoBuyBookName"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#expCongoBuyCreditCardNumber"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#expCongoBuyCreditCardType"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#expCongoBuyCreditCardExpirationDate"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#expCongoBuyDeliveryAddress"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#expCongoBuyPackagingSelection"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#expCongoBuyDeliveryTypeSelection"/> </daml:Restriction> </rdfs:subClassOf> </daml:Class> <!-- The following inputs and outputs of ExpandedCongoBuy are derived from the corresponding inputs and outputs of its atomic subprocesses (as indicated by their sameValuesAs properties), and will normally be computed automatically by DAML-S tools. For example, ExpandedCongoBuy uses an input, congoBuyBookName, that's the same as the bookName input to atomic process LocateBook. --> <rdf:Property rdf:ID="expCongoBuyBookName"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="&xsd;#string"/> <daml:sameValuesAs rdf:resource="#bookName"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuySignInInfo"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="#SignInData"/> <daml:sameValuesAs rdf:resource="#signInInfo"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyCreateAcctInfo"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="#AcctInfo"/> <daml:sameValuesAs rdf:resource="#createAcctInfo"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyCreditCardNumber"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="&xsd;#decimal"/> <daml:sameValuesAs rdf:resource="#creditCardNumber"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyCreditCardType"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="#CreditCardType"/> <daml:sameValuesAs rdf:resource="#creditCardType"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyCreditCardExpirationDate"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="&time;#Instant"/> <daml:sameValuesAs rdf:resource="#creditCardExpirationDate"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyDeliveryAddress"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="&xsd;#string"/> <daml:sameValuesAs rdf:resource="#deliveryAddress"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyPackagingSelection"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="#PackagingType"/> <daml:sameValuesAs rdf:resource="#packagingSelection"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyDeliveryTypeSelection"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="#DeliveryType"/> <daml:sameValuesAs rdf:resource="#deliveryTypeSelection"/> </rdf:Property> <rdf:Property rdf:ID="expCongoBuyCreateAcctOutput"> <rdfs:subPropertyOf rdf:resource="&process;#output"/> <rdfs:domain rdf:resource="#ExpandedCongoBuy"/> <rdfs:range rdf:resource="#CreateAcctOutputType"/> <daml:sameValuesAs rdf:resource="#createAcctOutput"/> </rdf:Property> <!-- CongoBuyBook is a sequence whose components are a composite process, BuySequence, followed by two atomic processes SpecifyDeliveryDetails, and then FinalizeBuy --> <daml:Class rdf:ID="CongoBuyBook"> <rdfs:subClassOf rdf:resource="&process;#CompositeProcess"/> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="&process;#composedOf"/> <daml:toClass> <daml:Class> <daml:intersectionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="process:Sequence"/> <daml:Restriction> <daml:onProperty rdf:resource="&process;#components"/> <daml:toClass> <daml:Class> <daml:listOfInstancesOf rdf:parseType="daml:collection"> <daml:Class rdf:about="#BuySequence"/> <daml:Class rdf:about="#SpecifyDeliveryDetails"/> <daml:Class rdf:about="#FinalizeBuy"/> </daml:listOfInstancesOf> </daml:Class> </daml:toClass> </daml:Restriction> </daml:intersectionOf> </daml:Class> </daml:toClass> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#congoBuyBookBookName"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#congoBuyBookCreditCardNumber"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#congoBuyBookCreditCardType"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#congoBuyBookCreditCardExpirationDate"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#congoBuyBookDeliveryAddress"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#congoBuyBookPackagingSelection"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#congoBuyBookDeliveryTypeSelection"/> </daml:Restriction> </rdfs:subClassOf> </daml:Class> <!-- The following inputs and outputs of CongoBuyBook are derived from the corresponding inputs and outputs of its atomic subprocesses (as indicated by their sameValuesAs properties), and will normally be computed automatically by DAML-S tools. --> <rdf:Property rdf:ID="congoBuyBookBookName"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="&xsd;#string"/> <daml:sameValuesAs rdf:resource="#bookName"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookCreateAcctInfo"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="#AcctInfo"/> <daml:sameValuesAs rdf:resource="#createAcctInfo"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookCreateAcctOutput"> <rdfs:subPropertyOf rdf:resource="&process;#output"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="#CreateAcctOutputType"/> <daml:sameValuesAs rdf:resource="#createAcctOutput"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookSignInInfo"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="#SignInData"/> <daml:sameValuesAs rdf:resource="#signInInfo"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookCreditCardNumber"> <rdfs:comment>NOTE: INTEGER IS NOT SUPPORTED YET IN DAML-L </rdfs:comment> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="&xsd;#decimal"/> <daml:sameValuesAs rdf:resource="#creditCardNumber"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookCreditCardType"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="#CreditCardType"/> <daml:sameValuesAs rdf:resource="#creditCardType"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookCreditCardExpirationDate"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="&time;#Instant"/> <daml:sameValuesAs rdf:resource="#creditCardExpirationDate"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookDeliveryAddress"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="&xsd;#string"/> <daml:sameValuesAs rdf:resource="#deliveryAddress"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookPackagingSelection"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="#PackagingType"/> <daml:sameValuesAs rdf:resource="#packagingSelection"/> </rdf:Property> <rdf:Property rdf:ID="congoBuyBookDeliveryTypeSelection"> <rdfs:subPropertyOf rdf:resource="&process;#input"/> <rdfs:domain rdf:resource="#CongoBuyBook"/> <rdfs:range rdf:resource="#DeliveryType"/> <daml:sameValuesAs rdf:resource="#deliveryTypeSelection"/> </rdf:Property> <!-- BuySequence is a sequence whose components are an atomic process PutInCart, followed by a composite process SignInAlternatives, followed by an atomic process SpecifyPaymentMethod --> <daml:Class rdf:ID="BuySequence"> <rdfs:subClassOf rdf:resource="&process;#CompositeProcess"/> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="&process;#composedOf"/> <daml:toClass> <daml:Class> <daml:intersectionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="process:Sequence"/> <daml:Restriction> <daml:onProperty rdf:resource="&process;#components"/> <daml:toClass> <daml:Class> <daml:listOfInstancesOf rdf:parseType="daml:collection"> <daml:Class rdf:about="#PutInCart"/> <daml:Class rdf:about="#SignInAlternatives"/> <daml:Class rdf:about="#SpecifyPaymentMethod"/> </daml:listOfInstancesOf> </daml:Class> </daml:toClass> </daml:Restriction> </daml:intersectionOf> </daml:Class> </daml:toClass> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#buySequenceBookName"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#buySequenceCreditCardNumber"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#buySequenceCreditCardType"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction daml:cardinality="1"> <daml:onProperty rdf:resource="#buySequenceCreditCardExpirationDate"/> </daml:Restriction> </rdfs:subClassOf> </daml:Class> <!-- and some other stuff....--> </rdf:RDF>
21 of 26