<?xml version="1.0" encoding="UTF-8"?>

<!-- ***********************************************************

 * DIG Interface Schema Definition 
 * Original Author: Sean Bechhofer, IMG, University of Manchester 

 * Source code/CVS information
 * =======================
 * Filename           $RCSfile: schema.xsd,v $
 * Revision           $Revision: 1.9 $
 * Release status     $State: Exp $
 * Last modified on   $Date: 2006/04/03 17:15:45 $
 *               by   $Author: seanb $

***********************************************************  -->

<xs:schema 
    targetNamespace="http://dl.kr.org/dig/lang/schema" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://dl.kr.org/dig/lang/schema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">

    <!-- Concept Language -->

    <xs:complexType name="named">
        <xs:annotation>
            <xs:documentation>Anything that has a URI, e.g. a class or property</xs:documentation>
        </xs:annotation>
        <xs:attribute name="URI" type="xs:anyURI" use="required"/>
    </xs:complexType>

    <xs:complexType name="optionalNamed">
        <xs:annotation>
            <xs:documentation>Anything that might have a URI, e.g. an individual</xs:documentation>
        </xs:annotation>
        <xs:attribute name="URI" type="xs:anyURI" use="optional"/>
    </xs:complexType>

    <xs:group name="description">
        <xs:annotation>
            <xs:documentation>Description-forming Operators</xs:documentation>
        </xs:annotation>
        <xs:choice>
	    <xs:element ref="class"/>
            <xs:element ref="intersectionOf"/>
            <xs:element ref="unionOf"/>
            <xs:element ref="complementOf"/>
            <xs:element ref="someValuesFrom"/>
            <xs:element ref="allValuesFrom"/>
            <xs:element ref="value"/>
            <xs:element ref="maxCardinality"/>
            <xs:element ref="minCardinality"/>
            <xs:element ref="cardinality"/>
            <xs:element ref="oneOf"/>
        </xs:choice>
    </xs:group>

    <xs:complexType name="description">
        <xs:group ref="description"/>
    </xs:complexType>

    <xs:element name="class" type="named"/>

    <xs:element name="intersectionOf" type="descriptions"/>

    <xs:element name="unionOf" type="descriptions"/>

    <xs:element name="complementOf" type="description"/> 

    <xs:element name="someValuesFrom">
      <xs:complexType>
	<xs:choice>
          <xs:sequence>
            <xs:group ref="objectPropertyExpression"/>
	    <xs:sequence minOccurs="0" maxOccurs="1">
	      <xs:choice>
		<xs:group ref="description"/>
		<xs:element name="self"/>
	      </xs:choice>
	    </xs:sequence>
          </xs:sequence>
          <xs:sequence>
            <xs:group ref="dataPropertyExpression"/>
	    <xs:sequence minOccurs="0" maxOccurs="1">
              <xs:element ref="datatypeExpression"/>
	    </xs:sequence>
          </xs:sequence>
	</xs:choice>
      </xs:complexType>
    </xs:element>

    <xs:element name="allValuesFrom">
      <xs:complexType>
	<xs:choice>
          <xs:sequence>
            <xs:group ref="objectPropertyExpression"/>
	    <xs:group ref="description"/>
          </xs:sequence>
          <xs:sequence>
            <xs:group ref="dataPropertyExpression"/>
            <xs:element ref="datatypeExpression"/>
          </xs:sequence>
	</xs:choice>
      </xs:complexType>
    </xs:element>

    <xs:element name="value">
      <xs:complexType>
	<xs:choice>
          <xs:sequence>
            <xs:group ref="objectPropertyExpression"/>
            <xs:element ref="individual"/>
          </xs:sequence>
          <xs:sequence>
            <xs:group ref="dataPropertyExpression"/>
            <xs:element ref="dataLiteral"/>
          </xs:sequence>
	</xs:choice>
      </xs:complexType>
    </xs:element>

    <xs:element name="maxCardinality" type="cardinality"/>

    <xs:element name="minCardinality" type="cardinality"/>

    <xs:element name="cardinality" type="cardinality"/>

    <xs:element name="oneOf">
      <xs:complexType>
        <xs:sequence>
          <xs:element ref="individual" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    
    <xs:complexType name="descriptions">
        <xs:annotation>
            <xs:documentation>Unordered sequence of Descriptions</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:group ref="description" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="twoOrMoreDescriptions">
        <xs:annotation>
            <xs:documentation>Unordered sequence of Descriptions with at least two</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:group ref="description" minOccurs="2" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="cardinality">
      <xs:annotation>
        <xs:documentation>Cardinality restriction</xs:documentation>
      </xs:annotation>
      <xs:choice>
        <xs:sequence>
          <xs:group ref="objectPropertyExpression"/>
	  <xs:sequence minOccurs="0" maxOccurs="1">
	    <xs:group ref="description"/>
	  </xs:sequence>
        </xs:sequence>
        <xs:sequence>
          <xs:group ref="dataPropertyExpression"/>
	  <xs:sequence minOccurs="0" maxOccurs="1">
            <xs:element ref="datatypeExpression"/>
	  </xs:sequence>
        </xs:sequence>
      </xs:choice>
      <xs:attribute name="num" type="xs:nonNegativeInteger" use="required"/>
    </xs:complexType>

    <!-- PlaceHolders -->
    <xs:element name="datatypeExpression" type="named"/>
    <xs:element name="dataLiteral" type="xs:string"/>

    <xs:group name="objectPropertyExpression">
        <xs:annotation>
            <xs:documentation>The objectPropertyExpression group describes an
            object Property expression, e.g. a single property,
            inverse or composition.</xs:documentation>
        </xs:annotation>
        <xs:choice>
            <xs:element ref="objectProperty"/>
            <xs:element ref="inverse"/>
            <xs:element name="propertyComposition">
	      <xs:complexType>
		<xs:sequence minOccurs="2" maxOccurs="unbounded">
		  <xs:choice>
		    <xs:element ref="objectProperty"/>
		    <xs:element ref="inverse"/>
		  </xs:choice>
		</xs:sequence>
	      </xs:complexType>
	    </xs:element>
        </xs:choice>
    </xs:group>

    <!-- A dataproperty expression is either an atomic dataProperty or a chain. -->
    <xs:group name="dataPropertyExpression">
        <xs:annotation>
            <xs:documentation>The dataPropertyExpression group
            describes an data Property expression, e.g. a single
            property or a chain.</xs:documentation>
        </xs:annotation>
        <xs:choice>
            <xs:element ref="dataProperty"/>
            <xs:element name="chain">
	      <xs:complexType>
		<xs:sequence>
		  <xs:choice minOccurs="1" maxOccurs="unbounded">
		    <xs:element ref="objectProperty"/>
		    <xs:element ref="inverse"/>
		  </xs:choice>
                  <xs:element ref="dataProperty"/>
		</xs:sequence>
	      </xs:complexType>
	    </xs:element>
        </xs:choice>
    </xs:group>
    
    <xs:complexType name="matchedPropertyValue">
        <xs:annotation>
            <xs:documentation>Pair of an object property and concept
            description or a data property and datatype
            Expression. </xs:documentation>
        </xs:annotation>
	<xs:choice>
          <xs:sequence>
            <xs:group ref="objectPropertyExpression"/>
            <xs:group ref="description"/>
          </xs:sequence>
          <xs:sequence>
            <xs:group ref="dataPropertyExpression"/>
            <xs:element ref="datatypeExpression"/>
          </xs:sequence>
	</xs:choice>
    </xs:complexType>

    <xs:complexType name="numMatchedPropertyValue">
        <xs:complexContent>
            <xs:extension base="matchedPropertyValue">
                <xs:attribute name="num" type="xs:nonNegativeInteger" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="objectProperty" type="named"/>
    <xs:element name="dataProperty" type="named"/>
    <xs:element name="inverse">
      <xs:complexType>
	<xs:sequence>
	  <xs:element ref="objectProperty"/>
	</xs:sequence>
      </xs:complexType>
    </xs:element>

    <!-- Anonymous individuals can appear anywhere -->
    <xs:element name="individual" type="optionalNamed"/>

    <!-- Tells -->

    <xs:element name="axioms" >
      <xs:complexType>
        <xs:sequence>
          <xs:group ref="axiom" minOccurs="1" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="uri" type="xs:anyURI" use="required"/>
      </xs:complexType>
    </xs:element>

    <xs:group name="axiom">
        <xs:choice>
            <xs:group ref="primitiveIntroduction"/>
            <xs:group ref="classAxiom"/>
            <xs:group ref="propertyAxiom"/>
            <xs:group ref="individualAxiom"/>
        </xs:choice>
    </xs:group>

    <xs:group name="primitiveIntroduction">
      <xs:choice>
        <xs:element name="defClass" type="named"/>
	<xs:element name="defObjectProperty" type="named"/>
	<xs:element name="defDataProperty" type="named"/>
	<xs:element name="defIndividual" type="named"/>
      </xs:choice>
    </xs:group>
    
    <xs:group name="classAxiom">
        <xs:choice>
	  <xs:element name="subClass" type="descriptionPair"/>
	  <xs:element name="equivalentClasses" type="twoOrMoreDescriptions"/>
          <xs:element name="disjoint" type="twoOrMoreDescriptions"/>
          <xs:element name="disjointUnion" type="twoOrMoreDescriptions"/>
        </xs:choice>
    </xs:group>

    <!-- Complex type used in property axioms. Note that
	  objectProperty is used rather than objectPropertyExpression -->

    <xs:complexType name="objectProperty">
      <xs:sequence>
	<xs:element ref="objectProperty"/>
      </xs:sequence>
    </xs:complexType>

    <xs:group name="propertyAxiom">
        <xs:choice>
	  <xs:element name="subProperty" type="matchedPropertyPair"/>
	  <xs:element name="equivalentProperties" type="matchedProperties"/>
	  <xs:element name="disjointProperties" type="matchedProperties"/>
	  <xs:element name="domain">
	    <xs:complexType>
              <xs:sequence>
                <xs:choice>
  		  <xs:element ref="objectProperty"/>
  		  <xs:element ref="dataProperty"/>
                </xs:choice>
                <xs:group ref="description"/>           
              </xs:sequence>
	    </xs:complexType>
	  </xs:element>
	  
	  <xs:element name="range">
	    <xs:complexType>
              <xs:choice>
		<xs:sequence>
  		  <xs:element ref="objectProperty"/>
		  <xs:group ref="description"/>
		</xs:sequence>
		<xs:sequence>
  		  <xs:element ref="dataProperty"/>
		  <xs:element ref="datatypeExpression"/>
		</xs:sequence>
              </xs:choice>
	    </xs:complexType>
	  </xs:element>

	  <xs:element name="transitive" type="objectProperty"/>
	  
	  <xs:element name="inverseFunctional" type="objectProperty"/>
	  
	  <xs:element name="symmetric" type="objectProperty"/>
	  
	  <xs:element name="antiSymmetric" type="objectProperty"/>
	  
	  <xs:element name="reflexive" type="objectProperty"/>
	  
	  <xs:element name="irreflexive" type="objectProperty"/>
	  
	  <xs:element name="functional">
	    <xs:complexType>
	      <xs:choice>
		<xs:element ref="objectProperty"/>
		<xs:element ref="dataProperty"/>
	      </xs:choice>
	    </xs:complexType>
	  </xs:element>

	  <xs:element name="leftIdentity">
	    <xs:complexType>
              <xs:sequence>
                <xs:element ref="objectProperty" minOccurs="2" maxOccurs="2"/>
              </xs:sequence>
	    </xs:complexType>
          </xs:element>

	  <xs:element name="rightIdentity">
	    <xs:complexType>
              <xs:sequence>
                <xs:element ref="objectProperty" minOccurs="2" maxOccurs="2"/>
              </xs:sequence>
	    </xs:complexType>
	  </xs:element>

        </xs:choice>
    </xs:group>

    <xs:group name="individualAxiom">
      <xs:choice>
	<xs:element name="instanceOf">
          <xs:complexType>
            <xs:sequence>
              <xs:element ref="individual"/>
              <xs:group ref="description"/>
            </xs:sequence>
          </xs:complexType>
	</xs:element>
	<xs:element name="value">
          <xs:complexType>
	    <xs:sequence>
	      <xs:element ref="individual"/>
	      <xs:choice>
		<xs:sequence>
		  <xs:group ref="objectPropertyExpression"/>
		  <xs:element ref="individual"/>
		</xs:sequence>
		<xs:sequence>
		  <xs:group ref="dataPropertyExpression"/>
		  <!-- Placeholder. This should be some kind of data literal -->
		  <xs:element ref="dataLiteral"/>
		</xs:sequence>
	      </xs:choice>
	    </xs:sequence>
          </xs:complexType>
	</xs:element>
	<!-- Syntactic sugar -->
	<xs:element name="notValue">
          <xs:complexType>
	    <xs:sequence>
	      <xs:element ref="individual"/>
	      <xs:choice>
		<xs:sequence>
		  <xs:group ref="objectPropertyExpression"/>
		  <xs:element ref="individual"/>
		</xs:sequence>
		<xs:sequence>
		  <xs:group ref="dataPropertyExpression"/>
		  <!-- Placeholder. This should be some kind of data literal -->
		  <xs:element ref="dataLiteral"/>
		</xs:sequence>
	      </xs:choice>
	    </xs:sequence>
          </xs:complexType>
	</xs:element>
        <xs:element name="different">
	  <xs:complexType>
            <xs:sequence>
              <xs:element ref="individual" minOccurs="2" maxOccurs="unbounded"/>
            </xs:sequence>
	  </xs:complexType>
	</xs:element>
        <xs:element name="same">
	  <xs:complexType>
            <xs:sequence>
              <xs:element ref="individual" minOccurs="2" maxOccurs="unbounded"/>
            </xs:sequence>
	  </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:group>
    
    <!-- Types that are used to represent pairs of things in axioms -->

    <xs:complexType name="descriptionPair">
        <xs:annotation>
            <xs:documentation>Pair of Descriptions</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:group ref="description" minOccurs="2" maxOccurs="2"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="matchedPropertyPair">
        <xs:annotation>
            <xs:documentation>A pair of properties, either two object or two data.</xs:documentation>
        </xs:annotation>
      <xs:choice>
        <xs:sequence>
            <xs:group ref="objectPropertyExpression" minOccurs="2" maxOccurs="2"/>
        </xs:sequence>
        <xs:sequence>
            <xs:group ref="dataPropertyExpression" minOccurs="2" maxOccurs="2"/>
        </xs:sequence>
      </xs:choice>
    </xs:complexType>

    <xs:complexType name="matchedProperties">
        <xs:annotation>
            <xs:documentation>A collection of properties, all object or all data.</xs:documentation>
        </xs:annotation>
      <xs:choice>
        <xs:sequence>
            <xs:group ref="objectPropertyExpression" minOccurs="2" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:sequence>
            <xs:group ref="dataPropertyExpression" minOccurs="2" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:choice>
    </xs:complexType>

</xs:schema>

<!--
 * ChangeLog
 * $Log: schema.xsd,v $
 * Revision 1.9  2006/04/03 17:15:45  seanb
 * Adding chains
 *
 * Revision 1.8  2006/04/03 16:46:09  seanb
 * Tidying up properties and property expressions
 *
 * Revision 1.7  2006/03/20 12:19:42  seanb
 * 1. Allowing multiple classes in equivalentClasses.
 *
 * 2. equivalentClass to equivalentClasses
 *    equivalentProperty to equivalentProperties
 *
 * 3. Added disjointUnion (syntactic sugar for 1.1). This isn't vital,
 *    but is useful I think if we are to stay close to 1.1.
 *
 * 4. Added disjointProperties.
 *
 * 5. Removed "related" for individual-property-individual relationships
 *    and replaced with a single value element for both data and object
 *    props.
 *
 * 6. Added "notValue" for individuals. Again to align with 1.1.
 *
 * 7. Individuals can be anonymous. Anonymous individuals can appear
 *    anywhere an individual can.
 *
 * Revision 1.6  2006/03/16 08:30:28  seanb
 * Removed individuals element
 *
 * Revision 1.5  2006/03/14 10:45:53  seanb
 * Minor wording changes
 * minOccurs on individuals
 * value -> hasValue
 *
 * Revision 1.4  2006/03/09 10:10:02  seanb
 * Multiple individuals in same
 * Addition of hasValue
 * Data properties in domains
 * Stubbed datatypes and dataliterals
 *
 * Revision 1.3  2006/03/08 16:45:51  seanb
 * Fixing missing individual in related.
 *
 *
 * Revision 1.2  2006/02/23 14:56:59  seanb
 * *** empty log message ***
 *
 * Revision 1.1  2006/02/22 18:24:14  seanb
 * Initial Checkin
 *
 *
 *
-->

