<?xml version='1.0'?>

<rdf:RDF
  xmlns:rdf ="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:daml="http://www.daml.org/2001/03/daml+oil#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
  xmlns:xsd ="http://www.w3.org/2000/10/XMLSchema#"
  xmlns     ="file:///daml/tools/validator/examples/ont1.daml#"
>

<daml:Class rdf:ID="Plant">
  <rdfs:label>Plant</rdfs:label>
</daml:Class>

<daml:Class rdf:ID="Animal">
  <rdfs:label>Animal</rdfs:label>
</daml:Class>

<daml:Class rdf:ID="Male">
   <rdfs:subClassOf rdf:resource="#Animal"/>
</daml:Class>

<daml:Class rdf:ID="Female">
  <rdfs:subClassOf rdf:resource="#Animal"/>
  <daml:disjointWith rdf:resource="#Male"/>
</daml:Class>



<daml:Class rdf:ID="Person">
  <rdfs:label>Person</rdfs:label>
  <daml:subClassOf rdf:resource="#Animal"/>
</daml:Class>

<daml:Class rdf:ID="Man">
  <rdfs:subClassOf rdf:resource="#Person"/>
  <rdfs:subClassOf rdf:resource="#Male"/>
</daml:Class>

<daml:Class rdf:ID="Woman">
  <rdfs:subClassOf rdf:resource="#Person"/>
  <rdfs:subClassOf rdf:resource="#Female"/>
</daml:Class>


<daml:ObjectProperty rdf:ID="hasParent">
  <rdfs:domain rdf:resource="#Animal"/>
  <rdfs:range rdf:resource="#Animal"/>
</daml:ObjectProperty>

<daml:ObjectProperty rdf:ID="hasFather">
  <rdfs:subPropertyOf rdf:resource="#hasParent"/>
  <rdfs:range rdf:resource="#Male"/>
</daml:ObjectProperty>

<daml:ObjectProperty rdf:ID="hasMother">
  <rdfs:subPropertyOf rdf:resource="#hasParent"/>
  <rdfs:range rdf:resource="#Female"/>
</daml:ObjectProperty>


<!-- Makes no assumption about spouses in general-->
<daml:ObjectProperty rdf:ID="hasSpouse"/>

<!-- A Man can have at most one Woman as a spouse -->
<daml:Class rdf:about="#Man">
  <daml:subClassOf>
    <daml:Restriction>
      <daml:onProperty rdf:resource="#hasSpouse"/>
      <daml:hasClassQ rdf:resource="#Woman"/>
      <daml:maxCardinalityQ>1</daml:maxCardinalityQ>
    </daml:Restriction>
  </daml:subClassOf>
</daml:Class>

<!-- A Woman can have at most one Man as a spouse -->
<daml:Class rdf:about="#Woman">
  <daml:subClassOf>
    <daml:Restriction>
      <daml:onProperty rdf:resource="#hasSpouse"/>
      <daml:hasClassQ rdf:resource="#Man"/>
      <daml:maxCardinalityQ>1</daml:maxCardinalityQ>
    </daml:Restriction>
  </daml:subClassOf>
</daml:Class>


<daml:ObjectProperty rdf:ID="hasChild">
  <rdfs:range rdf:resource="#Animal"/>
</daml:ObjectProperty>

<!-- A Person can only have a Person as a child -->
<daml:Class rdf:about="#Person">
  <daml:subClassOf>
    <daml:Restriction>
      <daml:onProperty rdf:resource="#hasChild"/>
      <daml:toClass rdf:resource="#Person"/>
    </daml:Restriction>
  </daml:subClassOf>
</daml:Class>

<!-- A Person who has exactly two Male children -->
<daml:Class rdf:ID="PersonWithTwoSons">
  <daml:subClassOf rdf:resource="#Person"/>
  <daml:subClassOf>
    <daml:Restriction>
      <daml:onProperty rdf:resource="#hasChild"/>
      <daml:hasClassQ rdf:resource="#Male"/>
      <daml:cardinalityQ>2</daml:cardinalityQ>
    </daml:Restriction>
  </daml:subClassOf>
</daml:Class>

<daml:Class rdf:ID="ManWithTwoSons">
  <daml:subClassOf rdf:resource="#PersonWithTwoSons"/>
  <daml:subClassOf rdf:resource="#Man"/>
</daml:Class>

<daml:Class rdf:ID="WomanWithTwoSons">
  <daml:subClassOf rdf:resource="#PersonWithTwoSons"/>
  <daml:subClassOf rdf:resource="#Woman"/>
</daml:Class>

<!-- An Animal with exactly one child -->
<daml:Class rdf:ID="AnimalWithOneChild">
  <daml:subClassOf rdf:resource="#Animal"/>
  <daml:subClassOf>
    <daml:Restriction>
      <daml:onProperty rdf:resource="#hasChild"/>
      <daml:cardinality>1</daml:cardinality>
    </daml:Restriction>
  </daml:subClassOf>
</daml:Class>

<!-- Generic property for all types of contact information -->
<daml:Property rdf:ID="hasContactInfo"/>

<!-- A ContactPerson must have a phone number -->
<daml:Class rdf:ID="ContactPerson">
  <daml:subClassOf rdf:resource="#Person"/>
  <daml:subClassOf>
    <daml:Restriction>
      <daml:onProperty rdf:resource="#hasContactInfo"/>
      <daml:hasClass rdf:resource="http://www.daml.org/validator/examples/dt1.xsd#phoneNumber"/>
    </daml:Restriction>
  </daml:subClassOf>
</daml:Class>
  

</rdf:RDF>
