<!-- ....................................................................... -->
<!-- XML Common Logic 1.0 DTD  ............................................. -->
<!-- file: xcl1.dtd
-->

<!-- XML Common Logic 1.0 DTD

     This is XCL, a formulation of Common Logic as an XML application.
     Copyright 2005 Murray Altheim. All Rights Reserved.

     Permission to use, copy, modify and distribute the XCL DTD and its
     accompanying documentation for any purpose and without fee is hereby
     granted in perpetuity, provided that the above copyright notice and
     this paragraph appear in all copies.  The copyright holders make no
     representation about the suitability of the DTD for any purpose.

     It is provided "as is" without expressed or implied warranty.

        Authors:    Murray M. Altheim <m.altheim@open.ac.uk>
                    Pat Hayes <phayes@ihmc.us>
        Status:     Preliminary
        Revision:   $Id: xcl1c.dtd,v 1.9 2005/12/05 23:28:20 altheim Exp $

     This DTD has the following formal public identifiers:

         "ISO/IEC 24707:2006//DTD XML Common Logic (XCL) 1.0//EN"

         "-//purl.org/xcl//DTD XML Common Logic (XCL) 1.0//EN"

     The DTD may be invoked by one of the following declarations:

         <!DOCTYPE text PUBLIC
             "ISO/IEC 24707:2006//DTD XCL Markup Language//EN">
             "xcl1.dtd">

         <!DOCTYPE text PUBLIC
             "-//purl.org/xcl//DTD XML Common Logic (XCL) 1.0//EN"
             "xcl1.dtd">

     where the system identifier ("xcl1.dtd") may be customized as
     necessary to specify the location of the DTD.

     If there is any perceived difference between the prose of the
     ISO standard and the XCL DTD, the former should be considered
     authoritive.
-->

<!-- Comments in the DTD

     The comments in this DTD which use the expressions "must",
     "shall" or "shall not" are normative requirements of this
     International Standard. Comments which use the expression
     "should" or "should not" are recommendations of this
     International Standard. Comments which use the verbs
     "recommend" or "deprecate" are recommendations and
     deprecations of this International Standard.
-->

<!-- a Uniform Resource Identifier, see clause 3.24 and [7]
-->
<!ENTITY % URI.datatype "CDATA" >

<!-- XML namespace support ....................................... -->

<!-- The XML Namespace URI for XCL 1.0 is

       "http://purl.org/xcl/1.0/"
-->

<!ENTITY XCL1.xmlns "http://purl.org/xcl/1.0/" >

<!-- C.1. General Syntax ................................................... -->

<!-- C.1.1 Content Models .............................. -->

<!ENTITY % Quantified.class
    "( quantified | forall | exists )"
>

<!ENTITY % Boolean.class
    "( boolean | and | or | implies | iff | not )"
>

<!ENTITY % Atomic.class
    "( atomic | relation | equal )"
>

<!ENTITY % Sentence.class
    "( %Quantified.class; | %Boolean.class; | %Atomic.class; )"
>

<!ENTITY % Comment.class
   "comment"
>

<!-- C.1.2 Attributes .................................. -->

<!-- C.1.2.1 Common Attributes

     The following attributes are declared on all XCL
     element types (though are not included in the
     descriptive text within the notes).

     xmlns (optional)  All XCL elements have a declared,
         optional 'xmlns' attribute whose fixed, default
         value matches the XML Namespace for XCL 1.0. XML
         processors may imply this attribute when not
         explicitly present in the document instance.

     id (optional)  All XCL elements have a declared,
         optional 'id' attribute whose value must match
         XML Name (production 5 of [XML]). When present,
         the ID value serves as the means of uniquely
         identifying a specific element within an XCL
         document. Note that this operates at the XML
         syntax level and has no semantic significance
         within CL. Each 'id' value must be unique
         within an XCL document.
-->

<!ENTITY % XCL.xmlns.attrib
    "xmlns         %URI.datatype;      #FIXED '&XCL1.xmlns;'"
>

<!ENTITY % id.attrib
    "id            ID                  #IMPLIED"
>

<!ENTITY % Common.attrib
    "%XCL.xmlns.attrib;
     %id.attrib;"
>

<!-- C.1.2.2 CL Dialect Attribute ............ -->

<!-- Name:         dialect
     URI:          http://purl.org/xcl/1.0/#dialect
     Declares:     http://purl.org/xcl/1.0/#dialect-xcl
                   http://purl.org/xcl/1.0/#dialect-clif
                   http://purl.org/xcl/1.0/#dialect-cgif
     Label:        CL Dialect
     Description:  an identifier for the CL dialect of the
                   element's content; see clauses 3.8, 7.1
-->
<!-- Notes:

     The 'dialect' attribute is used to indicate the dialect
     of its element's content. 'dialect' is a linking attribute
     whose value (a URI reference) contains a reference to one
     of the fixed set of CL dialect identifiers:

         http://purl.org/xcl/1.0/#dialect-xcl
         http://purl.org/xcl/1.0/#dialect-clif
         http://purl.org/xcl/1.0/#dialect-cgif

     For other concrete syntax representations, a suitable URI
     indicating the dialect should be used. In all XCL elements
     for which the 'dialect' attribute is declared, its absence
     indicates the default: the XCL dialect defined by this DTD.

     Note that the presence of a 'dialect' attribute overrides
     any 'dialect' attributes on parent elements; however, such
     parent-child dialect clashes are deprecated.

     This attribute is declared on the <text>, <module>, <import>,
     and <phrase> elements.

     Example:

         <text dialect="http://purl.org/xcl/1.0/#dialect-clif">
            (forall ex:romanceNovel ((x man)) (exists ((y woman))
               (and (loves x y) (not (loves y x))) ))
         </text>
-->

<!ENTITY XCL.dialect  "http://purl.org/xcl/1.0/#dialect-xcl"  >
<!ENTITY CLIF.dialect "http://purl.org/xcl/1.0/#dialect-clif" >
<!ENTITY CGIF.dialect "http://purl.org/xcl/1.0/#dialect-cgif" >

<!ENTITY % dialect.attrib
  "dialect         %URI.datatype;      '&XCL.dialect;'"
>

<!-- C.1.3 Comments .................................... -->

<!-- Name:         comment
     URI:          http://purl.org/xcl/1.0/#comment
     Label:        Comments
     Description:  Inserts a comment. <comment> elements can
                   be included within any XCL element and are
                   considered as comments on their immediate
                   parent element; see clause 6.1.1.3
-->
<!-- Notes:

     When well-formed XML processing is acceptable (see the
     section on XCL conformance), <comment> elements can
     comprise any text, can be mixed content, and can have
     any user-defined attributes; they are ignored by logical
     processors, but conforming XCL applications are required
     to preserve them and their position relative to other
     elements. Comments inside other comments are considered
     to be comments on the comment. In most cases, XCL content
     models include comments as the last children of the parent
     element.

     Note that XCL markup inside a comment is not considered
     to be part of the XCL containing element, and must also
     be suitably escaped.

     For situations where rich comment markup is desired but
     valid XCL is required, comments may contain a link to an
     external documentation source using the 'href' attribute:

         <comment href="http://www.acme.com/docs/sec7.html"/>

     If both element content and the 'href' attribute are
     present, the latter is considered optional, i.e.,
     traversing the link is not considered essential to
     ascertain the contents of the comment.

     With appropriate XML Namespace declarations, the
     %Comment.class; parameter entity can be redeclared to
     contain alternative XML content, e.g., XHTML or DocBook.

         <!ENTITY % Comment.class
             "( xhtml:div | comment )"
         >
-->

<!ENTITY % Comment.content
   "( #PCDATA | %Comment.class; )*"
>
<!ELEMENT comment  %Comment.content; >
<!ATTLIST comment
   %Common.attrib;
   href            %URI.datatype;      #IMPLIED
>

<!-- C.2. Top Level Elements ............................................... -->

<!-- C.2.1 XCL Document Element ........................ -->

<!-- Name:         text
     URI:          http://purl.org/xcl/1.0/#text
     Label:        XCL document element
     Description:  Used to surround any piece of XCL content,
                   as the delimiters of an XCL (i.e., XML)
                   document. Text inside this element must be
                   valid XCL. It need not be a module (ontology).
                   See the XCL Conformance section for details
                   on well-formedness constraints.
                   See clause 6.1.1.1
-->
<!-- Notes:

     Attributes:

       xml:base (optional)  Indicates the document base URI.

       dialect (optional)  see description in clause C.1.2.2.
           When not explicitly specified, this attribute defaults
           to the value indicating the XCL 1.0 (XML) syntax.

     Children:

       Zero or more <module>, <phrase>, and/or <comment> elements
       in any order.

     Example:

         <text dialect="http://purl.org/xcl/1.0/#dialect-xcl">
           <phrase>
             ...
           </phrase>
         </text>
-->

<!ENTITY % Text.content
   "( module | phrase | %Comment.class; )*"
>
<!ELEMENT text  %Text.content; >
<!ATTLIST text
   %Common.attrib;
   xml:base        %URI.datatype;      #IMPLIED
   %dialect.attrib;
>

<!-- C.2.2 XCL Modules ................................. -->

<!-- Name:         module
     URI:          http://purl.org/xcl/1.0/#module
     Label:        XCL Module
     Description:  Indicates that the enclosed content is
                   considered to be an XCL module (aka
                   ontology); see clause 6.1.1.4
-->
<!-- Notes:

     An XCL module is a fragment of XCL markup which has special
     attributes and satisfies certain extra constraints. An XCL
     document may comprise a single module, so this element, if
     present, will be the single child element of the <text>
     document element; in this case the module wrapper is not
     required.

     The <module> element's 'href' attribute serves as one means
     of identifying the module, the other being use of the 'id'
     attribute used with the base URI of the document to form an
     identifier. This standard does not recommend one method over
     the other, as this is considered application-dependent. The
     latter has the advantage of tying the module URI to the base
     URI of the document (which may be considered a feature or a
     bug) but then relies upon the presence of the 'xml:base'
     attribute on the <text> element. In its absence the base URI
     is considered arbitrary.

     Attributes:

       href (required)  Used to assign an "importing name" to a
           module. This is a URI reference, and often it will be the
           same as the xmlns default namespace and/or the URL of the
           containing document. However, this coincidence of naming is
           not required. No logical relationship is assumed between
           names based on their URI or XML namespace structure, so it
           is acceptable to use a URI reference containing a fragment
           ID to name an ontology.

           One document may contain several modules named with URI
           references formed from the URI of the document itself.
           (Intuitively, rather than being required to be the absolute
           URI of a namespace, the ontology importing name may be
           treated like other names in a namespace. This allows one
           ontology to treat another ontology as an entity in its
           namespace.)

       dialect (optional)  See description in clause C.1.2.2

     Example:

         <module href="http://www.acme.com/vocab/#agent-vocab">
             ...
         </module>
-->

<!ENTITY % Module.content
   "( import | exclude | phrase | %Comment.class; )*"
>
<!ELEMENT module  %Module.content; >
<!ATTLIST module
   %Common.attrib;
   href            %URI.datatype;      #REQUIRED
   %dialect.attrib;
>

<!-- C.2.3 Phrase Element .............................. -->

<!-- Name:         phrase
     URI:          http://purl.org/xcl/1.0/#phrase
     Label:        Phrase
     Description:  Used to indicate a top-level sentence
                   in XCL. The single child element should
                   be a sentence element; see clause 6.1.1.2
-->
<!-- Notes:

     Attributes:

       dialect (optional)  See description in clause C.1.2.2.

     Example:

         <phrase>
           TBD
         </phrase>
-->

<!ENTITY % Phrase.content
   "( %Sentence.class;, %Comment.class;* )"
>
<!ELEMENT phrase  %Phrase.content; >
<!ATTLIST phrase
   %Common.attrib;
   %dialect.attrib;
>

<!-- C.2.4 Import Element .............................. -->

<!-- Name:         import
     URI:          http://purl.org/xcl/1.0/#import
     Label:        Import
     Description:  A linking element used to import one XCL
                   module into another. The value of the
                   attribute should be a reference to an
                   identifier for an XCL module;
                   see clause 6.1.1.5
-->
<!-- Notes:

     Attributes:

     dialect (optional) may be included on an <import>
         element to indicate that the source should be
         encoded in that dialect. Conforming applications
         which find the XCL source to be encoded in a
         different dialect than the one indicated may either
         treat this as an error condition, or translate the
         source into the indicated dialect.

     Children:

       Zero or more <comment> child elements.

     Example:

         <import href="http://www.acme.com/vocab/agent-vocab.xcl"/>
-->

<!ENTITY % Import.content
   "( %Comment.class;* )"
>
<!ELEMENT import  %Import.content; >
<!ATTLIST import
   %Common.attrib;
   href            %URI.datatype;      #REQUIRED
   %dialect.attrib;
>

<!-- C.2.5 Exclude Element ............................. -->

<!-- Name:         exclude
     URI:          http://purl.org/xcl/1.0/#exclude
     Label:        Module Exclusions
     Description:  contains a sequence of zero or more <term>
                   elements, as wrappers for a set of CL names
                   considered as the exclusion set for the
                   module. This indicates any names in the text
                   which are explicitly excluded from the
                   module's local universe; see clause 6.1.1.4
-->
<!-- Notes:

     This element is used to indicate that these terms do not
     denote "things" in the current ontology, i.e. that they are
     nondenoting operators not included in the local domain of
     quantification. This allows an ontology to have strict
     control over the size of its intended domain of discourse.
     Names not listed in such a header are treated as denoting
     terms in the ontology.

     Nondenoting terms can be used only in the relation or
     function position of atoms and terms in this module. They
     cannot be used as arguments or be bound by quantifiers in
     this module. Note however that a term may be nondenoting in
     one ontology but denoting in another ontology: the assignment
     of nondenoting status is local to this module.

     This element has no attributes and no child elements.

     Example:

         <exclude>
           <term name="cow"/>
           <term name="pig"/>
           <term name="moose"/>
         </exclude>
-->

<!ENTITY % Exclude.content
   "( term )*"
>
<!ELEMENT exclude  %Exclude.content; >
<!ATTLIST exclude
   %Common.attrib;
>

<!-- C.3. Sentence Elements ................................................ -->

<!-- C.3.0.1 syntaxType Attribute ...................... -->

<!-- Name:         syntaxType
     URI:          http://purl.org/xcl/1.0/#syntaxType
     Label:        Syntax Type
     Description:  indicates the logical form of a generic
                   sentence; see clauses C.3.1.3, C.3.2.6
-->
<!-- Notes:

     Quantified and boolean sentences can be stated "generically"
     with an optional 'syntaxType' attribute, whose value is a
     URI reference indicating the appropriate logical form. The
     'syntaxType' link is provided for extensibility, to allow
     the inclusion of alternative logical syntax forms or
     patterns, e.g., numerical quantifiers or alternative boolean
     operators such as a binary conjunction or a Scheffer stroke.
     Currently there are no such extensions defined.

     The 'syntaxType' link is not used with the normal XCL
     quantifier and boolean sentence elements, which can be
     viewed as abbreviations for generic sentence elements with
     XCL-defined syntax types, e.g.,

         <forall>
           ...
         </forall>

     abbreviates

         <quantified syntaxType="http://purl.org/xcl/1.0/#forall">
           ...
         </quantified>

     Note that the 'dialect' attribute is not declared for
     sentence elements.
-->

<!ENTITY % syntaxType.attrib
  "syntaxType      %URI.datatype;      #IMPLIED"
>

<!-- C.3.0.2 logicalFormOf Attribute ................... -->

<!-- Name:         logicalFormOf
     URI:          http://purl.org/xcl/1.0/#logicalFormOf
     Label:        Logical-Form-Of
     Description:  an optional attribute on all XCL sentence
                   elements, whose value is a URI reference
                   indicating a syntactic category in some
                   external language specification.
-->
<!-- Notes:

     This is intended to indicate that the sentence is the result
     of a content-preserving translation into XCL of the syntactic
     form indicated. The 'logicalFormOf' attribute of this element
     should indicate the appropriate categories of subexpressions
     of the external expression.

     Only one "external" translation can be specified for a given
     piece of XCL. To indicate that a single XCL sentence is the
     logical form of two distinct external syntaxes, it is necessary
     to write it twice, with suitable 'logicalFormOf' values for
     each external specification. (The repetition may be indicated
     by the use of XML standards external to XCL.) Currently there
     are no such external mappings defined.

     Example:

       A Horn rule might appear in XCL as a univerally quantified
       implication between a conjunction and an atom; the value of
       the 'logicalFormOf' attribute is considered as applied to
       its parent <forall> element, which might be
       "http://acme.com/rulespec/#hornrule" and that of the internal
       conjunction and atomic conclusion might then be
       "http://acme.com/rulespec/#body" and "http://acme.com/rulespec/#head"
       (substituting suitable URIs).

         <forall logicalFormOf="http://acme.com/rulespec/#hornrule">
            ...
         </forall>
-->

<!ENTITY % logicalFormOf.attrib
  "logicalFormOf   %URI.datatype;      #IMPLIED"
>

<!-- C.3.1 Quantified Sentence Elements .......................... -->

<!ENTITY % Quantified.content
   "( guard?, var+, %Sentence.class;, %Comment.class;* )"
>

<!-- C.3.1.1 Forall Element ............................ -->

<!-- Name:         forall
     URI:          http://purl.org/xcl/1.0/#forall
     Label:        Universal Quantifier
     Description:  This encloses a quantified sentence
                   and indicates the universal quantifier;
                   see clause 6.1.1.7
-->

<!ELEMENT forall  %Quantified.content; >
<!ATTLIST forall
   %Common.attrib;
   %logicalFormOf.attrib;
   syntaxType      %URI.datatype;      #FIXED 'http://purl.org/xcl/1.0/#forall'
>

<!-- C.3.1.2 Exists Element ............................ -->

<!-- Name:         exists
     URI:          http://purl.org/xcl/1.0/#exists
     Label:        Existential Quantifier
     Description:  This encloses a quantified sentence
                   and indicates the existential quantifier;
                   see clause 6.1.1.7
-->

<!ELEMENT exists  %Quantified.content; >
<!ATTLIST exists
   %Common.attrib;
   %logicalFormOf.attrib;
   syntaxType      %URI.datatype;      #FIXED 'http://purl.org/xcl/1.0/#exists'
>

<!-- C.3.1.3 Quantified Sentence - Generic Form ........ -->

<!-- Name:         quantified
     URI:          http://purl.org/xcl/1.0/#quantified
     Label:        Quantified Sentence - Generic Form
     Description:  see clauses 6.1.1.7, C.3.0.1
-->

<!ELEMENT quantified  %Quantified.content; >
<!ATTLIST quantified
   %Common.attrib;
   sort            NMTOKEN             #IMPLIED
   href            %URI.datatype;      #REQUIRED
   %logicalFormOf.attrib;
   %syntaxType.attrib;
>

<!-- C.3.1.4 Guard Element ............................. -->

<!-- Name:         guard
     URI:          http://purl.org/xcl/1.0/#guard
     Label:        Quantifier Guard
     Description:  This optional element contains a single
                   <term> element, which is used as the
                   guard of the quantifier, if present;
                   see clauses A.2.3.8, C.3.1
-->
<!-- Notes:

     The <guard> element is used only inside quantifier elements,
     and must be the first child element if present.

     No attributes.

     Children:

       One required <term> element, followed by zero or more
       <comment> elements.

     Example:

       <forall>
         <guard>
           <term name="cow"/>
         </guard>
         TBD
       </forall>
-->
<!ENTITY % Guard.content
   "( term, %Comment.class;* )"
>

<!ELEMENT guard  %Guard.content; >
<!ATTLIST guard
   %Common.attrib;
>

<!-- C.3.1.5 Variable Element .......................... -->

<!-- Name:         var
     URI:          http://purl.org/xcl/1.0/#var
     Label:        Variable
     Description:  Encloses a name bound by a quantifier.
                   This must be a denoting name.
-->
<!-- Notes:

     Attributes:

       sort (optional). Value must be a name indicating the
         sort of the variable. This can be a nondenoting name.

     Children:

       Zero or more <comment> elements.

     Example:

       <var name="person"/>
-->

<!ENTITY % Var.content
   "( %Comment.class;* )"
>

<!ELEMENT var  %Var.content; >
<!ATTLIST var
   %Common.attrib;
   name            NMTOKEN             #REQUIRED
   sort            NMTOKEN             #IMPLIED
>

<!-- C.3.2 Boolean Sentence Elements ............................. -->

<!-- Boolean sentence elements

         <and> </and>
         <or> </or>
         <not> </not>
         <implies> </implies>
         <iff> </iff>

     These all enclose boolean sentences and indicate the
     truth-function.  The alternative generic form is

         <boolean syntaxType="http://purl.org/xcl/1.0/#and">
          ...
         </boolean>

     Only <implies> is order-sensitive:  by convention, the
     first child element is the antecendent, the second is
     the conclusion. (XCL does not require <role> elements
     for boolean sentences, e.g., antecedent/conclusion.)

     Attributes:

       syntaxType (optional) See clause C.3.0.1. Note that
           for non-generic sentence elements (e.g., <and>)
           the 'syntaxType' attribute is declared with a
           fixed, default value matching the URI identifier
           for the element type.

       logicalFormOf (optional) See clause C.3.0.2

     Children:

       Any boolean sentence element can have children of any
       sentence type. <and> and <or> contains any number of
       children (including zero); <not> contains exactly one;
       <implies> and <iff> contains exactly two.

       This is followed by zero or more <comment> elements.
-->

<!ENTITY % Boolean.content
   "( %Sentence.class; | %Comment.class; )*"
>

<!-- C.3.2.1 And Element ............................... -->

<!-- Name:         and
     URI:          http://purl.org/xcl/1.0/#and
     Label:        Conjunction
     Description:  see clause 6.1.1.8
-->

<!ELEMENT and  %Boolean.content; >
<!ATTLIST and
   %Common.attrib;
   %logicalFormOf.attrib;
   syntaxType      %URI.datatype;      #FIXED 'http://purl.org/xcl/1.0/#and'
>

<!-- C.3.2.2 Or Element ................................ -->

<!-- Name:         or
     URI:          http://purl.org/xcl/1.0/#or
     Label:        Disjunction
     Description:  see clause 6.1.1.8
-->
<!ELEMENT or  %Boolean.content; >
<!ATTLIST or
   %Common.attrib;
   %logicalFormOf.attrib;
   syntaxType      %URI.datatype;      #FIXED 'http://purl.org/xcl/1.0/#or'
>

<!-- C.3.2.3 Not Element ............................... -->

<!-- Name:         not
     URI:          http://purl.org/xcl/1.0/#not
     Label:        Negation
     Description:  see clause 6.1.1.8
-->
<!ENTITY % Not.content
   "( %Sentence.class;, %Comment.class;* )"
>
<!ELEMENT not  %Not.content; >
<!ATTLIST not
   %Common.attrib;
   %logicalFormOf.attrib;
   syntaxType      %URI.datatype;      #FIXED 'http://purl.org/xcl/1.0/#not'
>

<!-- C.3.2.4 Implies Element ........................... -->

<!-- Name:         implies
     URI:          http://purl.org/xcl/1.0/#implies
     Label:        Implication
     Description:  see clause 6.1.1.8
-->
<!ENTITY % ImpliesIff.content
   "( ( %Sentence.class;, %Sentence.class; ), %Comment.class;* )"
>

<!ELEMENT implies  %ImpliesIff.content; >
<!ATTLIST implies
   %Common.attrib;
   %logicalFormOf.attrib;
   syntaxType      %URI.datatype;      #FIXED 'http://purl.org/xcl/1.0/#implies'
>

<!-- C.3.2.5 Iff Element ............................... -->

<!-- Name:         iff
     URI:          http://purl.org/xcl/1.0/#iff
     Label:        Biconditional
     Description:  see clause 6.1.1.8
-->
<!ELEMENT iff  %ImpliesIff.content; >
<!ATTLIST iff
   %Common.attrib;
   %logicalFormOf.attrib;
   syntaxType      %URI.datatype;      #FIXED 'http://purl.org/xcl/1.0/#iff'
>

<!-- C.3.2.6 Boolean Sentence - Generic Form ........... -->

<!-- Name:         boolean
     URI:          http://purl.org/xcl/1.0/#boolean
     Label:        Boolean Sentence - Generic Form
     Description:  see clauses 6.1.1.8, C.3.2
-->
<!ELEMENT boolean  %Boolean.content; >
<!ATTLIST boolean
   %Common.attrib;
   sort            NMTOKEN             #IMPLIED
   href            %URI.datatype;      #REQUIRED
   %syntaxType.attrib;
>

<!-- C.3.3 Atomic Sentence Elements .............................. -->

<!-- Notes:

     Atomic sentence indicating that a relation holds true of some
     arguments. The first child element always indicates the relation;
     this may be a nondenoting name. XCL allows two distinct forms for
     specifying arguments of a relation, as an ordered list or as a
     collection of role-value pairs. The latter form is indicated by
     a 'syntaxType' attribute on the <atomic> element containing the
     'href' attribute value of:

         http://purl.org/xcl/1.0/#roleset

     Attributes:

       syntaxType (optional) See clause C.3.0.1

       logicalFormOf (optional) See clause C.3.0.2

     Children:

       One required <relation> element, followed by
       either zero or more <term> elements or zero
       or more <role> elements. This is then followed
       by zero or more <comment> elements.

     Example:

       <atomic>
         TBD
       </atomic>
-->

<!-- C.3.3.1 Atomic Element ............................ -->

<!-- Name:         atomic
     URI:          http://purl.org/xcl/1.0/#atomic
     Label:        Atomic Sentence
     Description:  see 6.1.1.9
-->

<!ENTITY % Atomic.content
   "( relation, ( term* | role* ), %Comment.class;* )"
>

<!ELEMENT atomic  %Atomic.content; >
<!ATTLIST atomic
   %Common.attrib;
   href            %URI.datatype;      #IMPLIED
   %logicalFormOf.attrib;
   %syntaxType.attrib;
>

<!-- C.3.3.2 Relation Element .......................... -->

<!-- Name:         relation
     URI:          http://purl.org/xcl/1.0/#relation
     Label:        Relation
     Description:  Encloses a <term> element. The name may
                   be nondenoting.
-->
<!-- Notes:

     No attributes.

     Children:

       One <term> followed by zero or more <comment> elements.

     Example:

       <relation>
         TBD
       </relation>
-->

<!ENTITY % Relation.content
   "( term, %Comment.class;* )"
>
<!ELEMENT relation  %Relation.content; >
<!ATTLIST relation
   %Common.attrib;
>

<!-- C.3.3.3 Equal Element ............................. -->

<!-- Name:         equal
     URI:          http://purl.org/xcl/1.0/#equal
     Label:        Equality
     Description:  see clause A.2.3.4
-->
<!-- Notes:

     No attributes.

     Children:

       There must be exactly two <term> elements.

     Example:

       <equal>
         <term name="Robert Dobbs"/>
         <term name="Bob Dobbs"/>
       </equal>
-->

<!ENTITY % Equal.content
   "( term, term )"
>
<!ELEMENT equal  %Equal.content; >
<!ATTLIST equal
   %Common.attrib;
>

<!-- C.3.3.4 Role Element .............................. -->

<!-- Name:         role
     URI:          http://purl.org/xcl/1.0/#role
     Label:        Role
     Description:  see clause A.2.3.5
-->
<!-- Notes:

     Attributes:

     name (required)  The value is a name which indicates
         the role of the content in the atom. Role names denote
         binary relations in CL, and may be nondenoting.

     Children:

       One required <term> element indicating the argument
       "filler" of the slot, followed by zero or more
       <comment> elements.

     Example of an atom using the role syntax:

       <atomic href="http://purl.org/xcl/1.0/#roleset">
         <relation>married</relation>
         <role name="wife">
           <term name="Jill"/>
         </role>
         <role name="husband">
           <term name="Jack"/>
         </role>
       </atomic>
-->

<!ENTITY % Role.content
   "( term, %Comment.class;* )"
>
<!ELEMENT role  %Role.content; >
<!ATTLIST role
   %Common.attrib;
   name            NMTOKEN             #REQUIRED
>

<!-- C.3.4 Term and Function Elements ............................ -->

<!-- C.3.4.1 Term Element .............................. -->

<!-- Name:         term
     URI:          http://purl.org/xcl/1.0/#term
     Label:        Term
     Description:  see clause 6.1.1.10
-->
<!-- Notes:

     The <term> element may take one of two forms (ignoring any
     <comment> elements, which are not grammatically significant):

     1. As an empty element, it encloses a name contained in its
        'name' attribute, and is permissible as the immediate
        child of a <guard>, <var>, <sort>, <relation>, <function>
        or <role> element.

     2. When it has element content, this indicates a term obtained
        by applying a function to some arguments. The first child
        element denotes the function and can be a term element. The
        name may be nondenoting.

     Attributes:

       When no <function> or <term> elements are present, the 'name'
       attribute is required (though this is not constrained by the
       DTD).

     Children:

       An optional sequence of one <function> element followed
       by one or more <term> elements, followed by zero or more
       <comment> elements.

     Examples:

       <term name="cow"/>

       <term>
         <function>
           <term name="pig"/>
           <term name="cow"/>
         </function>
         <term name="barnyard"/>
       </term>
-->

<!ENTITY % Term.content
   "( ( function, term+ )?, %Comment.class;* )"
>
<!ELEMENT term  %Term.content; >
<!ATTLIST term
   %Common.attrib;
   name            CDATA               #IMPLIED
>

<!-- C.3.4.2 Function Element .......................... -->

<!-- Name:         function
     URI:          http://purl.org/xcl/1.0/#function
     Label:        Function
     Description:  Encloses a <term> element. The name may
                   be nondenoting; see clause 6.1.1.11
-->
<!-- Notes:

     No attributes.

     Children:

       One <term> element followed by zero or more
       <comment> elements.

     Example:

       <function>
         TBD
       </function>
-->

<!ENTITY % Function.content
   "( term, %Comment.class;* )"
>
<!ELEMENT function  %Function.content; >
<!ATTLIST function
   %Common.attrib;
>

<!-- Architectural support declaration ............................

     In order to use the XCL 1.0 document type definition as a base
     architecture for other SGML/XML applications, the following
     architectural support declaration should be used:

       <?IS24707
         arch name="xcl"
         public-id="ISO/IEC 24707:2006//DTD XML Common Logic (XCL) 1.0//EN"
         dtd-system-id="http://purl.org/xcl/1.0/xcl1.dtd"
         renamer-att="XCLnames"
         doc-elem-form="text"
       ?>
-->

<!-- end of XCL 1.0 DTD -->
