<?xml version='1.0' encoding='ISO-8859-1'?>
<rdf:RDF 
  xmlns:rdf =  "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs = "http://www.w3.org/2000/01/rdf-schema#"
  xmlns:daml = "http://www.daml.org/2001/03/daml+oil#"
  xmlns:date = "http://www.ai.sri.com/daml/ontologies/sri-basic/1-0/Date.daml#"
  xmlns:airport = "http://www.daml.ri.cmu.edu/ont/AirportCodes.daml#"
  xmlns:city = "http://www.daml.ri.cmu.edu/ont/USCity.daml#"
  xmlns:process = "http://www.daml.org/services/daml-s/2001/05/Process.daml#">

<Ontology about="">
  <daml:versionInfo>
    $Id: yahooflight.daml, 05/26/2001 $
  </daml:versionInfo>
  <rdfs:comment>
    DAML-S example of yahoo flight service created by Honglei Zeng(hlzeng@ksl.stanford.edu).
    http://edit.yahoo.com/config/ytravel?resform=YahooFlightsR
  </rdfs:comment>
  <daml:imports rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns"/>
   <daml:imports rdf:resource="http://www.w3.org/2000/01/rdf-schema"/>
  <daml:imports rdf:resource="http://www.daml.org/2001/03/daml+oil"/>
  <daml:imports rdf:resource="http://www.ai.sri.com/ontologies/sri-basic/1-0/Date.daml"/>
  <daml:imports rdf:resource="http://www.daml.org/services/daml-s/2001/05/Process.daml"/>
  <daml:imports rdf:resource="http://www.daml.ri.cmu.edu/ont/AirportCodes.daml"/>
  <daml:imports rdf:resource="http://www.daml.ri.cmu.edu/ont/USCity.daml"/>
</Ontology>


<!-- The basic service is a flight-booking service from Yahoo travel website -->
<!-- The service locates at http://edit.yahoo.com/config/ytravel?resform=YahooFlightsR -->
<!-- Global issues: 
1. It is difficult to model the service, but not too difficult to encode the service in DAML-S. 
2. It is difficult to specify constraints, especially conditional constraints. 
3. Data flow is not very clear in DAML-S.  
-->

<!-- The Basic Service Process-->
<rdfs:Class rdf:ID="BookFlight">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="PassengerNumber">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="daml:Integer"/>
</rdf:Property>

<rdf:Property rdf:ID="ChildrenNumber">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <!--NOTE: number of children from 2-11 years old-->
  <rdfs:range rdf:resource="daml:Integer"/>
</rdf:Property>

<rdf:Property rdf:ID="City">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <!--NOTE:city name refers to CMU City ontology-->
  <rdfs:range rdf:resource="city:City"/>
</rdf:Property>  

<rdf:Property rdf:ID="DepartureCity">
  <rdfs:subPropertyOf rdf:resource="#City"/>
</rdf:Property>

<rdf:Property rdf:ID="ArrivalCity">
  <rdfs:subPropertyOf rdf:resource="#City"/>
  <rdfs:range>
      <!-- Note: constraint of DepartureCity != ArrivalCity -->    
      <daml:Restriction>
        <daml:onProperty rdf:resource="#disjointWith" />
        <daml:hasClass rdf:resource="#DepartureCity"/>
	<daml:toClass rdf:resource="#ArrivalCity"/> 
      </daml:Restriction>
  </rdfs:range>    
</rdf:Property>

<rdf:Property rdf:ID="DepartureDate">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="date:Date"/>
</rdf:Property>

<rdf:Property rdf:ID="ReturnDate">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <!-- Note: If After property is defined in Date.daml then we can specify
   constraint that ReturnDate is after DepartureDate -->  
  <rdfs:range rdf:resource="date:Date"/>
</rdf:Property>

<rdfs:Class rdf:ID="TripType">
  <daml:oneOf rdf:parseType="daml:collection">
    <TripType rdf:ID="RoundTrip"/>
    <TripType rdf:ID="OneWayTrip"/>	
  </daml:oneOf>
</rdfs:Class>

<rdf:Property rdf:ID="selectTripType">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="#TripType"/>
</rdf:Property>

<rdfs:Class rdf:ID="SeatType">
  <daml:oneOf rdf:parseType="daml:collection">
    <SeatType rdf:ID="CoachClass"/>
    <SeatType rdf:ID="BusinessClass"/>
    <SeatType rdf:ID="FirstClass"/>
  </daml:oneOf>
</rdfs:Class>

<rdf:Property rdf:ID="selectSeatType">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="#SeatType"/>
</rdf:Property> 

<!-- customer information: these are best defined in other
     (customer/credit card) ontologies. Some definitions
     below are copied from congobuy example.  -->

<rdf:Property rdf:ID="CustomerName">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="rdfs:Literal"/>
</rdf:Property> 

<rdf:Property rdf:ID="creditCardNumber">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="daml:Integer"/>
</rdf:Property>

<rdfs:Class rdf:ID="CreditCardTypes">
  <daml:oneOf rdf:parseType="daml:collection">
    <CreditCardType rdf:ID="MasterCard"/>
    <CreditCardType rdf:ID="VISA"/>
    <CreditCardType rdf:ID="AmericanExpress"/>
    <CreditCardType rdf:ID="DiscoverCard"/>
   </daml:oneOf>
</rdfs:Class>    

<rdf:Property rdf:ID="creditCardType">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="#CreditCardTypes"/>
</rdf:Property>

<rdf:Property rdf:ID="creditCardExpirationDate">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="date:Date"/>
</rdf:Property>

<rdf:Property rdf:ID="deliveryAddress">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="rdfs:Literal"/>
</rdf:Property>

<rdfs: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>
</rdfs:Class>

<rdf:Property rdf:ID="selectDeliveryType">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="#DeliveryType"/>
</rdf:Property>  

<rdfs:Class rdf:ID="TicketType">
  <daml:oneOf rdf:parseType="daml:collection">
    <TicketType rdf:ID="E-Ticket"/>
    <TicketType rdf:ID="RegularTicket"/>
  </daml:oneOf>
</rdfs:Class>

<rdf:Property rdf:ID="selectTicketType">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="#TicketType"/>
</rdf:Property>      

<rdf:Property rdf:ID="BookFlightInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#BookFlight"/>
  <rdfs:range rdf:resource="#BookFlightInputBag"/>
</rdf:Property>
                       
<!-- Real yahoo flight service is much more complex than this
     simplified version -->

<!-- question: how to specify constraints easily and consistently? 
    In this example,
    there are two types of constraints: (1) "hard" constraints:
    such as DepartureCity should be different from ArrivalCity;
    ReturnDate should be later than DepartureDate etc.
    (2) conditional constraints, such as if the trip type is
    one way then you can't input the ReturnData. -->
    
<rdfs:Class rdf:ID="BookFlightInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <BookFlightInputBag rdf:resource ="#PassengerNumber"/>
    <BookFlightInputBag rdf:resource ="#ChildrenNumber"/>
    <BookFlightInputBag rdf:resource ="#DepartureCity"/>
    <BookFlightInputBag rdf:resource ="#ArrivalCity"/>
    <BookFlightInputBag rdf:resource ="#DepartureDate"/>
    <BookFlightInputBag rdf:resource ="#ReturnDate"/>
    <BookFlightInputBag rdf:resource ="#selectTripType"/>
    <BookFlightInputBag rdf:resource ="#selectSeatType"/>
    <BookFlightInputBag rdf:resource ="#CustomerName"/>
    <BookFlightInputBag rdf:resource ="#creditCardNumber"/>
    <BookFlightInputBag rdf:resource ="#creditCardType"/>
    <BookFlightInputBag rdf:resource ="#creditCardExpirationDate"/>
    <BookFlightInputBag rdf:resource ="#selectTicketType"/>
    <BookFlightInputBag rdf:resource ="#deliveryAddress"/>
    <BookFlightInputBag rdf:resource ="#selectDeliveryType"/>
 </daml:unionOf>
</rdfs:Class>

<!-- One output: E-receipt -->
<rdf:Class rdf:ID="EReceipt">
</rdf:Class>

<rdf:Property rdf:ID="eReceiptOutput">
  <rdfs:subPropertyOf rdf:resource="process:output"/>
  <rdfs:range rdf:resource="#EReceipt"/>
</rdf:Property>

<rdf:Property rdf:ID="BookFlightOutputs">
  <rdfs:subPropertyOf rdf:resource="#eReceiptOutput"/>
  <rdfs:domain rdf:resource ="#BookFlight"/>
</rdf:Property>

<!--the effect depends on whether the ticket type is E-ticket
    or regular ticket -->

<rdfs:Class rdf:ID="BuyEffectType">
  <daml:oneOf rdf:parseType="daml:collection">
    <BuyEffect rdf:ID="EticketIssued"/>
    <BuyEffect rdf:ID="RegularTicketShipped"/>
    <BuyEffect rdf:ID="Failure"/>
  </daml:oneOf>
</rdfs:Class>

<rdf:Property rdf:ID="buyEffect">
  <rdfs:subPropertyOf rdf:resource="process:effect"/>
  <rdfs:range rdf:resource="#BuyEffectType"/>
</rdf:Property>

<rdf:Property rdf:ID="BookFlightEffect">
  <rdfs:subPropertyOf rdf:resource="buyEffect"/>
  <rdfs:domain rdf:resource="#BookFlight"/>
</rdf:Property>

<!-- The expanded Service Process, defined in terms of subprocesses-->
<process:expand> 
  <rdfs:Class> rdfs:about ="#BookFlight"</rdfs:Class> 
  <rdfs:Class> rdfs:about ="#ExpandedBookFlight"</rdfs:Class>
</process:expand>

<!-- determine the trip is one-way or two-way. -->

<rdfs:Class rdf:ID="DetermineTripType">
  <rdfs:subClassOf rdf:resource="process:Condition"/>
  <rdfs:subClassOf>	
      <daml:Restriction>
        <daml:onProperty rdf:about="#DetermineTripTypeInput" />
        <daml:hasValue rdf:resource="#OneWayTrip"/>
      </daml:Restriction>
  </rdfs:subClassOf>
</rdfs:Class>

<rdf:Property rdf:ID="DetermineTripTypeInput">
  <rdfs:subPropertyOf rdf:resource="#selectTripType"/>
  <rdfs:domain rdf:resource ="#DetermineTripType"/>
</rdf:Property>

<!-- search flight schedule subprocess -->

<rdfs:Class rdf:ID="SearchFlightOneWay">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="SearchFlightOneWayInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#SearchFlightOneWay"/>
  <rdfs:range rdf:resource="#SearchFlightOneWayInputBag"/>
</rdf:Property>

<rdfs:Class rdf:ID="SearchFlightOneWayInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <SearchFlightOneWayInputBag rdf:resource ="#PassengerNumber"/>
    <SearchFlightOneWayInputBag rdf:resource ="#ChildrenNumber"/>
    <SearchFlightOneWayInputBag rdf:resource ="#DepartureCity"/>
    <SearchFlightOneWayInputBag rdf:resource ="#ArrivalCity"/>
    <SearchFlightOneWayInputBag rdf:resource ="#DepartureDate"/>
    <SearchFlightOneWayInputBag rdf:resource ="#selectSeatType"/>
 </daml:unionOf>
</rdfs:Class>

<rdfs:Class rdf:ID="SearchFlightTwoWay">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="SearchFlightTwoWayInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#SearchFlightTwoWay"/>
  <rdfs:range rdf:resource="#SearchFlightTwoWayInputBag"/>
</rdf:Property>

<rdfs:Class rdf:ID="SearchFlightTwoWayInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <SearchFlightTwoWayInputBag rdf:resource ="#PassengerNumber"/>
    <SearchFlightTwoWayInputBag rdf:resource ="#ChildrenNumber"/>
    <SearchFlightTwoWayInputBag rdf:resource ="#DepartureCity"/>
    <SearchFlightTwoWayInputBag rdf:resource ="#ArrivalCity"/>
    <SearchFlightTwoWayInputBag rdf:resource ="#DepartureDate"/>
    <SearchFlightTwoWayInputBag rdf:resource ="#ArrivalDate"/>
    <SearchFlightTwoWayInputBag rdf:resource ="#selectSeatType"/>
 </daml:unionOf>
</rdfs:Class>

<!-- preconditions of search flight subprocess: input parameters are valid -->

<rdf:Property rdf:ID="FlightScheduleOneWayPreCondition">
  <rdfs:subPropertyOf rdf:resource="process:precondition"/>
  <rdfs:domain rdf:resource ="SearchFlightOneWay"/>
</rdf:Property>

<rdf:Property rdf:ID="FlightScheduleTwoWayPreCondition">
  <rdfs:subPropertyOf rdf:resource="process:precondition"/>
  <rdfs:domain rdf:resource ="SearchFlightTwoWay"/>
</rdf:Property>

<!-- output is a list of flight schedules -->

<rdf:Property rdf:ID="FlightScheduleOneWayList">
  <rdfs:subPropertyOf rdf:resource="process:output"/>
  <rdfs:domain rdf:resource ="SearchFlightOneWay"/>
  <rdfs:range rdf:resource ="daml:list"/>
</rdf:Property>

<rdf:Property rdf:ID="FlightScheduleTwoWayList">
  <rdfs:subPropertyOf rdf:resource="process:output"/>
  <rdfs:domain rdf:resource ="SearchFlightTwoWay"/>
  <rdfs:range rdf:resource ="daml:list"/>
</rdf:Property>

<!-- locate airport code: Input is city name, output is airport
     code of that city (Ignore the case that a city has more than
     one airports) -->

<rdfs:Class rdf:ID="LocateAirportCode">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="locateAirportCodeInput">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#LocateAirportCode"/>
  <rdfs:range rdf:resource="city:City"/>
</rdf:Property>

<rdf:Property rdf:ID="AirportCode">
  <rdfs:subPropertyOf rdf:resource="process:output"/>
  <rdfs:domain rdf:resource ="#LocateAirportCode"/>
  <rdfs:range rdf:resource="airport:AirportCode"/>
</rdf:Property>

<!-- Select flight from flight schedule list -->

<rdfs:Class rdf:ID="UserFlightItinerary">
</rdfs:Class>

<rdfs:Class rdf:ID="SelectFlight">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="SelectFlightInput">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#SelectFlight"/>
  <rdfs:range rdf:resource="daml:list"/>
</rdf:Property>

<rdf:Property rdf:ID="SelectFlightOutput">
  <rdfs:subPropertyOf rdf:resource="process:output"/>
  <rdfs:domain rdf:resource ="#SelectFlight"/>
  <rdfs:range rdf:resource="#UserFlightItinerary"/>
</rdf:Property>

<!-- customer information -->

<rdf:Property rdf:ID="AccountName">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="#rdfs:Literal"/>
</rdf:Property>

<rdf:Property rdf:ID="AccountPassword">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:range rdf:resource="#rdfs:Literal"/>
</rdf:Property>

<!-- check whether customer's account exists -->

<rdfs:Class rdf:ID="CheckAccount">
  <rdfs:subClassOf rdf:resource="process:Condition"/>
</rdfs:Class>

<rdf:Property rdf:ID="CheckAccountInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#CheckAccount"/>
  <rdfs:range rdf:resource="#checkAccountInputBag"/>
</rdf:Property>

<rdfs:Class rdf:ID="CheckAccountInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <SignInAccountInputBag rdf:resource ="#AccountName"/>
    <SignInAccountInputBag rdf:resource ="#AccountPassword"/>
 </daml:unionOf>
</rdfs:Class>

<!-- sign in account subprocess -->

<rdfs:Class rdf:ID="SignInAccount">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="SignInAccountInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#SignInAccount"/>
  <rdfs:range rdf:resource="#SignInAccountInputBag"/>
</rdf:Property>

<rdfs:Class rdf:ID="SignInAccountInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <SignInAccountInputBag rdf:resource ="#AccountName"/>
    <SignInAccountInputBag rdf:resource ="#AccountPassword"/>
 </daml:unionOf>
</rdfs:Class>

<!-- create new customer account subprocess -->

<rdfs:Class rdf:ID="createAccount">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="createAccountInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#createAccount"/>
  <rdfs:range rdf:resource="#ScreateAccountInputBag"/>
</rdf:Property>

<rdfs:Class rdf:ID="createAccountInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <createAccountInputBag rdf:resource ="#AccountName"/>
    <createAccountInputBag rdf:resource ="#AccountPassword"/>
 </daml:unionOf>
</rdfs:Class>

<!-- get credit card information subprocess-->

<rdfs:Class rdf:ID="GetCreditCard">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="GetCreditCardInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#GetCreditCard"/>
  <rdfs:range rdf:resource="#GetCreditCardInputBag"/>
</rdf:Property>
    
<rdfs:Class rdf:ID="GetCreditCardInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <GetCreditCardInputBag rdf:resource ="#CustomerName"/>
    <GetCreditCardInputBag rdf:resource ="#creditCardNumber"/>
    <GetCreditCardInputBag rdf:resource ="#creditCardType"/>
    <GetCreditCardInputBag rdf:resource ="#creditCardExpirationDate"/>
 </daml:unionOf>
</rdfs:Class>

<!-- determine ticket deliver method -->

<rdfs:Class rdf:ID="DetermineTicketType">
  <rdfs:subClassOf rdf:resource="process:Condition"/>
  <rdfs:subClassOf>	
      <daml:Restriction>
        <daml:onProperty rdf:resource="#DetermineTicketTypeInput" />
        <daml:hasValue rdf:resource="#RegularTicket"/>
      </daml:Restriction>
  </rdfs:subClassOf>
</rdfs:Class>

<rdf:Property rdf:ID="DetermineTicketTypeInput">
  <rdfs:subPropertyOf rdf:resource="selectTicketType"/>
  <rdfs:domain rdf:resource="#DetermineTicketType"/>
</rdf:Property>


<!-- get mailing address of regular ticket -->

<rdfs:Class rdf:ID="GetMailAddress">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<rdf:Property rdf:ID="GetMailAddressInputs">
  <rdfs:subPropertyOf rdf:resource="process:input"/>
  <rdfs:domain rdf:resource ="#GetMailAddress"/>
  <rdfs:range rdf:resource="#GetMailAddressInputBag"/>
</rdf:Property>
                       
<rdfs:Class rdf:ID="GetMailAddressInputBag">
 <daml:unionOf rdf:parseType="daml:collection">
    <GetMailAddressInputBag rdf:resource ="#deliveryAddress"/>
    <GetMailAddressInputBag rdf:resource ="#selectDeliveryType"/>
 </daml:unionOf>
</rdfs:Class>

<!-- finalize order -->

<rdfs:Class rdf:ID="FinalizeOrder">
  <rdfs:subClassOf rdf:resource="process:Process"/>
</rdfs:Class>

<!-- One output: E-receipt -->
<rdf:Property rdf:ID="eReceiptOutput">
  <rdfs:subPropertyOf rdf:resource="#eReceiptOutput"/>
  <rdfs:domain rdf:resource="#FinalizeOrder"/>
</rdf:Property>

<rdf:Property rdf:ID="ExpandedBookFlightEffect">
  <rdfs:subPropertyOf rdf:resource="buyEffect"/>
  <rdfs:domain rdf:resource="#FinalizeOrder"/>
</rdf:Property>

<!-- composite service bookflight -->
<!-- questions: To what extent should we model the service? -->
	
<rdfs:Class rdf:ID="BookFlight">
  <rdfs:subClassOf rdf:resource="process:CompositeProcess"/>
  <daml:sameClassAs>
    <process:Sequence>
      <daml:item>
        <rdfs:Class rdfs:about="#LocateAirportCode"/>
      </daml:item>
      <daml:item>
        <process:If-Then-Else>
          <process:IfCondition>
            <rdfs:Class rdfs:about="#DetermineTripType"/>
          </process:IfCondition>
          <process:ThenCondition>
            <rdfs:Class rdfs:about="#SearchFlightOneWay"/>
          </process:ThenCondition>
          <process:ElseCondition>
            <rdfs:Class rdfs:about="#SearchFlightTwoWay"/>
          </process:ElseCondition>
        </process:If-Then-Else>
      </daml:item>
      <daml:item>
        <rdfs:Class rdfs:about="#SelectFlight"/>
      </daml:item>
      <daml:item>
        <process:If-Then-Else>
          <process:IfCondition>
            <rdfs:Class rdfs:about="#CheckAccount"/>
          </process:IfCondition>
          <process:ThenCondition>
            <rdfs:Class rdfs:about="#SignInAccount"/>
          </process:ThenCondition>
          <process:ElseCondition>
            <rdfs:Class rdfs:about="#CreateAccount"/>
          </process:ElseCondition>
        </process:If-Then-Else>
      </daml:item>
      <daml:item>
        <rdfs:Class rdfs:about="#GetCreditCard"/>
      </daml:item>
      <daml:item>
        <process:If-Then-Else>
          <process:IfCondition>
            <rdfs:Class rdfs:about="#DetermineTicketType"/>
          </process:IfCondition>
          <process:ThenCondition>
            <rdfs:Class rdfs:about="#GetMailAddress"/>
          </process:ThenCondition>
          <process:ElseCondition/>
        </process:If-Then-Else>
      </daml:item>
      <daml:item>
        <rdfs:Class rdfs:about="#FinalizeOrder"/>
      </daml:item>
    </process:Sequence>
  </daml:sameClassAs>
</rdfs:Class>

</rdf:RDF>
