- From: Drew McDermott <drew.mcdermott@yale.edu>
- Date: Mon, 12 Jan 2004 23:08:08 -0500 (EST)
- To: public-sws-ig@w3.org
- Message-Id: <200401130408.i0D488O03303@pantheon-po01.its.yale.edu>
Several allusions have been made to the DRS system for representing logical formulas in RDF. DRS is a sort of generalized Owl Rules Language. I am at long last able to release a DRS Guide and accompanying Owl ontology for formulas. The Guide is included as an attached PDF file. The URL for the ontology may be found at http://www.cs.yale.edu/homes/dvm/daml/drsonto040112.owl It's been validated by BBN's vOWLidator (http://owl.bbn.com/validator/), which helped me find a fix lots of bugs. (I admit that there several warnings remaining when my endurance ran out; I don't know how important they were.) The ontology and attached PDF follow. -- -- Drew McDermott Yale Computer Science Department <?xml version='1.0' encoding='ISO-8859-1'?> <!DOCTYPE rdf:RDF [ <!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'> <!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'> <!ENTITY owl 'http://www.w3.org/2002/07/owl#'> <!ENTITY xsd 'http://www.w3.org/2001/XMLSchema#'> <!ENTITY ruleml 'http://www.daml.org/2003/11/swrl/swrl.rdf#'> <!ENTITY swrl 'http://www.daml.org/2003/11/swrl/swrl.rdf#'> <!ENTITY drs 'http://www.cs.yale.edu/homes/dvm/drsonto040112.owl#'> ]> <rdf:RDF xmlns:rdf ="&rdf;" xmlns:rdfs="&rdfs;" xmlns="&owl;" xmlns:owl ="&owl;" xmlns:xsd ="&xsd;" xmlns:drs ="&drs;" xmlns:swrl="&swrl;" > <Ontology rdf:about=""> <rdfs:comment> This ontology describes formulas in logical languages. </rdfs:comment> </Ontology> <Class rdf:ID="Type"/> <!-- drs:Types are not owl:Classes, although for the purposes of this --> <!-- ontology you can pretend they are --> <drs:Type rdf:ID="Prop"> <rdfs:comment> The type of Propositions </rdfs:comment> </drs:Type> <Class rdf:ID="Function"/> <!-- These is provided for backward compatibility --> <ObjectProperty rdf:ID="function_domain"> <rdfs:domain resource="#Function"/> <rdfs:range resource="#Type"/> </ObjectProperty> <ObjectProperty rdf:ID="function_range"> <rdfs:domain resource="#Function"/> <rdfs:range resource="#Type"/> </ObjectProperty> <ObjectProperty rdf:ID="FunctionDomain"> <equivalentProperty rdf:resource="#function_domain"/> </ObjectProperty> <ObjectProperty rdf:ID="FunctionRange"> <equivalentProperty rdf:resource="#function_range"/> </ObjectProperty> <Class rdf:ID="Predicate"> <rdfs:subClassOf rdf:resource="#Function"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="#function_range"/> <hasValue rdf:resource="#Prop"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Term"/> <!-- Every resource can be a term, but we don't say that; it would collapse drs:Term and owl:Thing together, which would be confusing --> <rdf:Description rdf:about="&swrl;Variable"> <rdfs:subClassOf rdf:resource="#Term"/> </rdf:Description> <Class rdf:ID="Literal"> <rdfs:subClassOf rdf:resource="#Term"/> </Class> <ObjectProperty rdf:ID="declare"> <rdfs:domain resource="#Type"/> </ObjectProperty> <Class rdf:ID="Formula"> <rdfs:subClassOf rdf:resource="#Term"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="#declare"/> <allValuesFrom rdf:resource="#Prop"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Functional_term"> <rdfs:subClassOf rdf:resource="#Term"/> </Class> <ObjectProperty rdf:ID="term_function"> <rdfs:domain rdf:resource="#Functional_term"/> <rdfs:range rdf:resource="#Function"/> </ObjectProperty> <Class rdf:ID="Term_seq"> <rdfs:subClassOf rdf:resource="&rdf;List"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;first"/> <allValuesFrom rdf:resource="#Term"/> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <allValuesFrom rdf:resource="#Term_seq"/> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;first"/> <cardinality>1</cardinality> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <cardinality>1</cardinality> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Var_seq"> <rdfs:subClassOf rdf:resource="#Term_seq"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;first"/> <allValuesFrom rdf:resource="&swrl;Variable"/> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <allValuesFrom rdf:resource="#Var_seq"/> </Restriction> </rdfs:subClassOf> </Class> <ObjectProperty rdf:ID="term_args"> <rdfs:domain rdf:resource="#Functional_term"/> <rdfs:range rdf:resource="#Term_seq"/> </ObjectProperty> <Class rdf:ID="Binder"> <rdfs:subClassOf rdf:resource="#Formula"/> </Class> <Class rdf:ID="Atomic_formula"> <unionOf rdf:parseType="Collection"> <Class> <intersectionOf rdf:parseType="Collection"> <Class rdf:about="#Formula"/> <Class rdf:about="#Functional_term"/> <Restriction> <onProperty rdf:resource="#term_function"/> <allValuesFrom rdf:resource="#Predicate"/> </Restriction> </intersectionOf> </Class> <Class rdf:about="&swrl;Atom"/> </unionOf> </Class> <rdf:Description rdf:about="&swrl;Atom"> <rdfs:subClassOf rdf:resource="#Atomic_formula"/> </rdf:Description> <!-- There are two ways to describe any atomic formula, as a functional term or as a triple. We'd like to say that the args = cons(subj, obj), but presumably hopeless. In addition, we have to absorb the class swrl:Atom, which provides several more ways to describe atomic formulas. --> <ObjectProperty rdf:about="&rdf;predicate"> <rdfs:domain rdf:resource="#Atomic_formula"/> <rdfs:range rdf:resource="#Predicate"/> </ObjectProperty> <ObjectProperty rdf:about="&rdf;subject"> <rdfs:domain rdf:resource="#Atomic_formula"/> <rdfs:range rdf:resource="#Term"/> </ObjectProperty> <ObjectProperty rdf:about="&rdf;object"> <rdfs:domain rdf:resource="#Atomic_formula"/> <rdfs:range> <Class> <unionOf rdf:parseType="Collection"> <Class> <oneOf rdf:parseType="Collection"> <Thing rdf:about="#Null"/> </oneOf> </Class> <Class rdf:about="#Term"/> <Class rdf:about="#Term_seq"/> </unionOf> </Class> </rdfs:range> </ObjectProperty> <Class rdf:ID="Function_skeleton"> <rdfs:subClassOf rdf:resource="#Functional_term"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="#term_args"/> <allValuesFrom rdf:resource="#Var_seq"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Predicate_skeleton"> <intersectionOf rdf:parseType="Collection"> <Class rdf:about="#Atomic_formula"/> <Class rdf:about="#Function_skeleton"/> </intersectionOf> </Class> <Class rdf:ID="Connective_formula"> <rdfs:subClassOf rdf:resource="#Formula"/> </Class> <ObjectProperty rdf:ID="conn_args"> <rdfs:domain rdf:resource="#Connective_formula"/> <rdfs:range rdf:resource="#Formula_seq"/> </ObjectProperty> <Class rdf:ID="And"> <rdfs:subClassOf rdf:resource="#Connective_formula"/> </Class> <Class rdf:ID="Or"> <rdfs:subClassOf rdf:resource="#Connective_formula"/> </Class> <Class rdf:ID="Unary_formula"> <rdfs:subClassOf rdf:resource="#Connective_formula"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="#conn_args"/> <allValuesFrom rdf:resource="#Length1_list"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Binary_formula"> <rdfs:subClassOf rdf:resource="#Connective_formula"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="#conn_args"/> <allValuesFrom rdf:resource="#Length2_list"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Not"> <rdfs:subClassOf rdf:resource="#Unary_formula"/> </Class> <ObjectProperty rdf:ID="negated"> <rdfs:domain rdf:resource="#Not"/> <rdfs:range rdf:resource="#Formula"/> </ObjectProperty> <!-- The 'negated' of a 'Not' is the 'first' of its 'conn_args' --> <Class rdf:ID="Implies"> <rdfs:subClassOf rdf:resource="#Binary_formula"/> </Class> <!-- The following are labels for the two conn_args of Implies --> <ObjectProperty rdf:ID="antecedent"> <rdfs:domain rdf:resource="#Implies"/> <rdfs:range rdf:resource="#Formula"/> </ObjectProperty> <ObjectProperty rdf:ID="consequent"> <rdfs:domain rdf:resource="#Implies"/> <rdfs:range rdf:resource="#Formula"/> </ObjectProperty> <ObjectProperty rdf:ID="declaration"> <rdfs:domain rdf:resource="#Function"/> <rdfs:range rdf:resource="#Function_skeleton"/> </ObjectProperty> <DatatypeProperty rdf:ID="value"> <rdfs:domain rdf:resource="#Literal"/> <!-- range can be any XSD datatype --> </DatatypeProperty> <!-- type restriction: If a term is a Literal and is declared of type Y, then the 'value' should be a literal of type Y. Can this be expressed in OWL? --> <Class rdf:ID="Forall"> <rdfs:subClassOf rdf:resource="#Binder"/> </Class> <Class rdf:ID="Exists"> <rdfs:subClassOf rdf:resource="#Binder"/> </Class> <ObjectProperty rdf:ID="bound_vars"> <rdfs:domain rdf:resource="#Binder"/> <rdfs:range rdf:resource="#Var_bag"/> </ObjectProperty> <ObjectProperty rdf:ID="body"> <rdfs:domain rdf:resource="#Binder"/> <rdfs:range rdf:resource="#Formula"/> </ObjectProperty> <!-- There's nothing to say about Null --> <rdf:Description rdf:ID="Null"/> <ObjectProperty ID="type"> <rdfs:comment>Identifies the Class of a resource</rdfs:comment> </ObjectProperty> <Class rdf:ID="Constant"> <rdfs:domain rdf:resource="#Term"/> </Class> <Class rdf:ID="Constant_bag"> <rdfs:subClassOf rdf:resource="&rdf;List"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;first"/> <allValuesFrom rdf:resource="#Constant"/> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <allValuesFrom rdf:resource="#Constant_bag"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Var_bag"> <rdfs:subClassOf rdf:resource="&rdf;List"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;first"/> <allValuesFrom rdf:resource="&swrl;Variable"/> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <allValuesFrom rdf:resource="#Var_bag"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Formula_seq"> <rdfs:subClassOf rdf:resource="&rdf;List"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;first"/> <allValuesFrom rdf:resource="#Formula"/> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <allValuesFrom rdf:resource="#Formula_seq"/> </Restriction> </rdfs:subClassOf> </Class> <Class rdf:ID="Term_bag"> <rdfs:subClassOf rdf:resource="&rdf;List"/> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;first"/> <allValuesFrom rdf:resource="#Term"/> </Restriction> </rdfs:subClassOf> <rdfs:subClassOf> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <allValuesFrom rdf:resource="#Term_bag"/> </Restriction> </rdfs:subClassOf> </Class> <ObjectProperty rdf:about="&rdf;first"/> <ObjectProperty rdf:about="&rdf;rest"/> <Class rdf:about="&rdf;List"/> <Class rdf:ID="Nonempty_list"> <intersectionOf rdf:parseType="Collection"> <Class rdf:about="&rdf;List"/> <Class> <complementOf> <Class> <oneOf rdf:parseType="Collection"> <Thing rdf:about="&rdf;nil"/> </oneOf> </Class> </complementOf> </Class> </intersectionOf> </Class> <Class rdf:ID="Length1_list"> <intersectionOf rdf:parseType="Collection"> <Class rdf:about="#Nonempty_list"/> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <hasValue rdf:resource="&rdf;nil"/> </Restriction> </intersectionOf> </Class> <Class rdf:ID="Length2_list"> <intersectionOf rdf:parseType="Collection"> <Class rdf:about="#Nonempty_list"/> <Restriction> <onProperty rdf:resource="&rdf;rest"/> <allValuesFrom rdf:resource="#Length1_list"/> </Restriction> </intersectionOf> </Class> <DatatypeProperty rdf:ID="litdefn"> <rdfs:domain rdf:resource="#Literal"/> <!-- The range is any literal, but I don't think that's a class --> </DatatypeProperty> </rdf:RDF>
Attachments
- application/pdf attachment: DRSguide.pdf
Received on Monday, 12 January 2004 23:08:46 UTC