From: Ian Horrocks ([email protected])
Date: 06/27/01
Here is the promised sketch of how to do acyclical lists in DAML+OIL. There are no doubt many syntax errors (can we have human read/writeable syntax PLEASE!). I assumed the standard headers and stuff. I made it generic so that it is easy to have different types of list (different element types), but this does make it a little more complex than would be required for the simple case. Regards, Ian <daml:TransitiveProperty rdf:ID="rest+"/> <daml:ObjectProperty rdf:ID="first"/> <daml:ObjectProperty rdf:ID="rest"> <rdfs:subPropertyOf rdf:resource="#rest+"/> </daml:ObjectProperty> <daml:Class rdf:ID="Null"> <rdfs:comment> Null marks end of list. It has no first or rest properties. </rdfs:comment> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="#first"/> <daml:toClass rdf:resource="http://www.daml.org/2001/03/daml+oil#Nothing"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="#rest"/> <daml:toClass rdf:resource="http://www.daml.org/2001/03/daml+oil#Nothing"/> </daml:Restriction> </rdfs:subClassOf> </daml:Class> <daml:Class rdf:ID="Head"> <rdfs:comment> Head marks the first element of a list and prevents cyclical lists. </rdfs:comment> </daml:Class> <daml:Class rdf:ID="Element"> <rdfs:comment> A list element is either Null (end of list) or a first/rest structure. </rdfs:comment> <rdfs:subClassOf> <daml:unionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="#Null"/> <daml:Class> <daml:intersectionOf rdf:parseType="daml:collection"> <daml:Restriction> <daml:onProperty rdf:resource="#first"/> <daml:hasClass rdf:resource="http://www.daml.org/2001/03/daml+oil#Thing"/> </daml:Restriction> <daml:Restriction> <daml:onProperty rdf:resource="#rest"/> <daml:hasClass> <daml:Class> <daml:intersectionOf rdf:parseType="daml:collection"> <daml:Class rdf:about="#Element"/> <daml:Class> <daml:complementOf rdf:resource="#Head"/> </daml:Class> </daml:intersectionOf> </daml:Class> </daml:hasClass> </daml:Restriction> <daml:Restriction daml:maxCardinality="1"> <daml:onProperty rdf:resource="#rest"/> </daml:Restriction> <daml:Restriction daml:maxCardinality="1"> <daml:onProperty> <daml:ObjectProperty> <daml:inverseOf rdf:resource="#rest"/> </daml:ObjectProperty> </daml:onProperty> </daml:Restriction> </daml:intersectionOf> </daml:Class> </daml:unionOf> </rdfs:subClassOf> </daml:Class> <daml:Class rdf:ID="List"> <rdfs:comment> Generic list. </rdfs:comment> <rdfs:subClassOf rdf:resource="#Head"/> <rdfs:subClassOf rdf:resource="#Element"/> </daml:Class> <daml:Class rdf:ID="ListC"> <rdfs:comment> List all of whose elements are of type C. </rdfs:comment> <rdfs:subClassOf rdf:resource="#List"/> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="#first"/> <daml:toClass rdf:resource="#C"/> </daml:Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <daml:Restriction> <daml:onProperty rdf:resource="#rest+"/> <daml:Restriction> <daml:onProperty rdf:resource="#first"/> <daml:toClass rdf:resource="#C"/> </daml:Restriction> </daml:Restriction> </rdfs:subClassOf> </daml:Class>
This archive was generated by hypermail 2.1.4 : 04/02/02 EST