<?xml-stylesheet href="proofsystem.xsl" type="text/xsl"?>
<proofSystem title="RELAX NG Formal Semantics">

<notation>

<item><var range="string"/> ranges over strings; a string is a sequence
of zero or more Unicode scalar values</item>

<item><function name="emptyString"/> represents an empty string</item>

<item>
      <function name="split">
        <var range="string"/>
      </function>
returns a sequence of strings one for each whitespace delimited token
of <var range="string"/>
</item>

<item><var
range="ncname"/> ranges over local names (NCNames, names without
prefixes)</item>

<item><var range="uri"/> ranges over URIs</item>

<item>
      <function name="name">
        <var range="uri"/>
        <var range="ncname"/>
      </function>
constructs an (expanded) name with URI <var range="uri"/> and local name <var
range="ncname"/>
</item>

<item><var range="name"/> ranges over expanded names</item>

<item><var range="nameClass"/> ranges over name classes</item>

<item>
    <judgement name="belongs">
      <var range="name"/>
      <var range="nameClass"/>
    </judgement>
asserts that name <var range="name"/> is a member of name class <var
range="nameClass"/>

</item>

<item>
      <function name="attribute">
        <var range="name"/>
        <var range="string"/>
      </function>
constructs an attribute with name <var range="name"/>
and value <var range="string"/>
</item>

<item><var range="att"/> ranges over bags (unordered collections) of
attributes; a bag with a single member is considered the same as that
member</item>

<item><function name="emptyBag"/> represents an empty bag</item>

<item>
      <function name="union">
	<var range="att" sub="1"/>
	<var range="att" sub="2"/>
      </function>
represents the bag union of <var range="att" sub="1"/>
and <var range="att" sub="2"/> (the number of occurrences of any member
of

      <function name="union">
	<var range="att" sub="1"/>
	<var range="att" sub="2"/>
      </function>

is the sum of the number of its occurrences in <var range="att" sub="1"/>
and <var range="att" sub="2"/>)

</item>

<item><var
range="namespaceMap"/> ranges over namespace maps;
a namespace map is a mapping from namespace prefixes to URIs</item>

<item><function name="emptyNamespaceMap"/> represents an empty namespace
map</item>

<item><var range="params"/> ranges over sequences of parameters</item>

<item>
    <judgement name="datatypeAllows">
      <var range="uri"/>
      <var range="ncname"/>
      <var range="params"/>
      <var range="string"/>
      <var range="namespaceMap"/>
    </judgement>
asserts that in the datatype library identified by URI <var
range="uri"/>, the string <var range="string"/> interpreted in the
context of the namespace map <var range="namespaceMap"/> is a legal
value of datatype <var range="ncname"/> with parameters <var
range="params"/></item>

<item>
    <judgement name="datatypeEqual">
      <var range="uri"/>
      <var range="ncname"/>
      <var range="string" sub="1"/>
      <var range="namespaceMap" sub="1"/>
      <var range="string" sub="2"/>
      <var range="namespaceMap" sub="2"/>
    </judgement>
asserts that in the datatype library identified by URI <var range="uri"/>,
string <var range="string" sub="1"/> interpreted in the context
of the namespace map <var range="namespaceMap" sub="1"/>
represents the same value of the datatype <var range="ncname"/>
as the string <var range="string" sub="2"/> interpreted in the context of
<var range="namespaceMap" sub="2"/>
</item>

<item><var range="mixed"/> ranges over sequences of elements
and strings; a sequence with a single member is considered
the same as that member</item>

<item>
    <judgement name="normalized">
      <var range="mixed"/>
    </judgement>
asserts that the mixed sequence <var range="mixed"/> is normalized: it
does not contain any member that is an empty string, nor does it
contain two consecutive members that are both strings
</item>

<item>
      <function name="element">
	<var range="name"/>
        <var range="namespaceMap"/>
	<var range="att"/>
	<var range="mixed"/>
      </function>
constructs an element with name <var range="name"/>,
namespace map <var range="namespaceMap"/>,
attributes <var range="att"/>
and mixed sequence <var range="mixed"/> as children
</item>

<item><var
range="element"/> ranges over elements</item>

<item>
      <function name="append">
	<var range="mixed" sub="1"/>
	<var range="mixed" sub="2"/>
      </function>
represents the concatenation of the sequences <var range="mixed" sub="1"/> and <var range="mixed" sub="2"/>

</item>

<item><function name="emptySequence"/> represents an empty sequence</item>

<item><var range="attval"/> ranges over strings and the empty sequence;
this is a subset of the range of <var range="mixed"/></item>

<item><function name="toString">
        <var range="attval"/>
      </function>
returns an empty string if <var range="attval"/> is the empty sequence
and otherwise returns <var range="attval"/></item>

<item>
      <function name="stripSpace">
        <var range="mixed"/>
      </function>
returns the sequence <var range="mixed"/> after removing any
member that is a string consisting entirely of whitespace
</item>

<item>
    <judgement name="interleave">
      <var range="mixed" sub="1"/>
      <var range="mixed" sub="2"/>
      <var range="mixed" sub="3"/>
    </judgement>
asserts that <var range="mixed" sub="1"/>
is an interleaving of <var range="mixed" sub="2"/>
and <var range="mixed" sub="3"/>
</item>

<item>
      <function name="key">
        <var range="ncname" sub="1"/>
        <var range="uri"/>
        <var range="ncname" sub="2"/>
        <var range="string"/>
        <var range="namespaceMap"/>
      </function>
constructs a key in symbol space <var range="ncname" sub="1"/>
with datatype <var range="ncname" sub="2"/>
in the datatype library <var range="uri"/>
with lexical value <var range="string"/>
interpreted with respect to namespace map <var range="namespaceMap"/>
</item>

<item><var
range="keybag"/> ranges over bags of keys</item>

<item>
      <judgement name="keyConflict">
	<var range="keybag"/>
      </judgement>
asserts that there are conflicting keys in the unordered collection
of keys <var range="keybag"/>
</item>

<item>
      <judgement name="subset">
	<var range="keybag" sub="1"/>
	<var range="keybag" sub="2"/>
      </judgement>
asserts that <var range="keybag" sub="1"/>
is a subset of <var range="keybag" sub="2"/>
</item>

<item>
      <function name="keyref">
        <var range="ncname" sub="1"/>
        <var range="uri"/>
        <var range="ncname" sub="2"/>
        <var range="string"/>
        <var range="namespaceMap"/>
      </function>
constructs a key reference in symbol space <var range="ncname" sub="1"/>
with datatype <var range="ncname" sub="2"/>
in the datatype library <var range="uri"/>
with lexical value <var range="string"/>
interpreted with respect to namespace map <var range="namespaceMap"/>
</item>

<item><var range="keyrefbag"/> ranges over bags of key
references</item>

<item>
    <judgement name="keyComplete">
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
asserts that the collection of keys <var range="keybag"/>
has a key that satisfies every key reference in
the collection of key references <var range="keyrefbag"/>
</item>

<item><var range="pattern"/> ranges over patterns</item>

<item>
   <namespaceMap>
     <var range="namespaceMap"/>
   </namespaceMap>
within the start-tag of a pattern refers to the namespace map
of the pattern element
</item>

<item>
    <judgement name="valid">
      <var range="element"/>
      <var range="pattern"/>
    </judgement>
asserts that the element <var range="element"/> is valid with respect to the
pattern <var range="pattern"/>
</item>

<item>
      <function name="emptyEnv"/>
constructs an empty environment
</item>

<item><var range="defs"/> ranges over sequences of definitions</item>

<item>
      <function name="env">
        <var range="defs"/>
        <var range="env"/>
      </function>
constructs an environment with definitions <var range="defs"/>
and parent environment <var range="env"/>
</item>

<item><var range="env"/> ranges over environments</item>

<item>
    <judgement name="binds">
      <var range="env"/>
      <var range="ncname"/>
      <var range="pattern"/>
    </judgement>
asserts that in environment <var range="env"/>, local name
<var range="ncname"/> is bound to pattern <var range="pattern"/>

</item>


<item>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
asserts that in the context of the environment <var range="env"/> and
namespace map <var range="namespaceMap"/>, the attributes <var
range="att"/> and the sequence of elements and strings <var
range="mixed"/> matches the pattern <var range="pattern"/> generating
the collection of keys <var range="keybag"/> and key references <var
range="keyrefbag"/>
</item>


</notation>

  <rule name="valid">
    <judgement name="match">
      <function name="emptyEnv"/>
      <function name="emptyNamespaceMap"/>
      <function name="emptyBag"/>
      <var range="element"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
    <judgement name="keyComplete">
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
    <not>
      <judgement name="keyConflict">
	<var range="keybag"/>
      </judgement>
    </not>
    <judgement name="valid">
      <var range="element"/>
      <var range="pattern"/>
    </judgement>
  </rule>
      
  <rule name="group">

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att" sub="1"/>
      <var range="mixed" sub="1"/>
      <var range="pattern" sub="1"/>
      <var range="keybag" sub="1"/>
      <var range="keyrefbag" sub="1"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att" sub="2"/>
      <var range="mixed" sub="2"/>
      <var range="pattern" sub="2"/>
      <var range="keybag" sub="2"/>
      <var range="keyrefbag" sub="2"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="union">
	<var range="att" sub="1"/>
	<var range="att" sub="2"/>
      </function>
      <function name="append">
	<var range="mixed" sub="1"/>
	<var range="mixed" sub="2"/>
      </function>
      <element name="group">
	<var range="pattern" sub="1"/>
	<var range="pattern" sub="2"/>
      </element>
      <function name="union">
        <var range="keybag" sub="1"/>
        <var range="keybag" sub="2"/>
      </function>
      <function name="union">
        <var range="keyrefbag" sub="1"/>
        <var range="keyrefbag" sub="2"/>
      </function>
    </judgement>

  </rule>

  <rule name="oneOrMore 1">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <element name="oneOrMore">
        <var range="pattern"/>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
  </rule>

  <rule name="oneOrMore 2">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att" sub="1"/>
      <var range="mixed" sub="1"/>
      <var range="pattern"/>
      <var range="keybag" sub="1"/>
      <var range="keyrefbag" sub="1"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att" sub="2"/>
      <var range="mixed" sub="2"/>
      <element name="oneOrMore">
        <var range="pattern"/>
      </element>
      <var range="keybag" sub="2"/>
      <var range="keyrefbag" sub="2"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="union">
	<var range="att" sub="1"/>
	<var range="att" sub="2"/>
      </function>
      <function name="append">
	<var range="mixed" sub="1"/>
	<var range="mixed" sub="2"/>
      </function>
      <element name="oneOrMore">
        <var range="pattern"/>
      </element>
      <function name="union">
        <var range="keybag" sub="1"/>
        <var range="keybag" sub="2"/>
      </function>
      <function name="union">
        <var range="keyrefbag" sub="1"/>
        <var range="keyrefbag" sub="2"/>
      </function>
    </judgement>
  </rule>

  <rule name="interleave 1">

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att" sub="1"/>
      <var range="mixed" sub="1"/>
      <var range="pattern" sub="1"/>
      <var range="keybag" sub="1"/>
      <var range="keyrefbag" sub="1"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att" sub="2"/>
      <var range="mixed" sub="2"/>
      <var range="pattern" sub="2"/>
      <var range="keybag" sub="2"/>
      <var range="keyrefbag" sub="2"/>
    </judgement>

    <judgement name="interleave">
      <var range="mixed" sub="3"/>
      <var range="mixed" sub="1"/>
      <var range="mixed" sub="2"/>
    </judgement>


    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="union">
	<var range="att" sub="1"/>
	<var range="att" sub="2"/>
      </function>
      <var range="mixed" sub="3"/>
      <element name="interleave">
	<var range="pattern" sub="1"/>
	<var range="pattern" sub="2"/>
      </element>
      <function name="union">
        <var range="keybag" sub="1"/>
        <var range="keybag" sub="2"/>
      </function>
      <function name="union">
        <var range="keyrefbag" sub="1"/>
        <var range="keyrefbag" sub="2"/>
      </function>
    </judgement>

  </rule>

  <rule name="interleave 2">
   
    <judgement name="interleave">
      <function name="emptySequence"/>
      <function name="emptySequence"/>
      <function name="emptySequence"/>
    </judgement>

  </rule>

  <rule name="interleave 3">
   
    <judgement name="interleave">
      <var range="mixed" sub="1"/>
      <var range="mixed" sub="2"/>
      <var range="mixed" sub="3"/>
    </judgement>

    <judgement name="interleave">
      <function name="append">
        <var range="mixed" sub="4"/>
        <var range="mixed" sub="1"/>
      </function>
      <function name="append">
        <var range="mixed" sub="4"/>
        <var range="mixed" sub="2"/>
      </function>
      <var range="mixed" sub="3"/>
    </judgement>

  </rule>

  <rule name="interleave 4">
   
    <judgement name="interleave">
      <var range="mixed" sub="1"/>
      <var range="mixed" sub="2"/>
      <var range="mixed" sub="3"/>
    </judgement>

    <judgement name="interleave">
      <function name="append">
        <var range="mixed" sub="4"/>
        <var range="mixed" sub="1"/>
      </function>
      <var range="mixed" sub="2"/>
      <function name="append">
        <var range="mixed" sub="4"/>
        <var range="mixed" sub="3"/>
      </function>
    </judgement>

  </rule>

  <rule name="choice 1">

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <var range="pattern" sub="1"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <element name="choice">
	<var range="pattern" sub="1"/>
	<var range="pattern" sub="2"/>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

  </rule>

  <rule name="choice 2">

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <var range="pattern" sub="2"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <element name="choice">
	<var range="pattern" sub="1"/>
	<var range="pattern" sub="2"/>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

  </rule>


  <rule name="element">

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap" sub="1"/>
      <var range="att"/>
      <function name="stripSpace">
        <var range="mixed"/>
      </function>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="belongs">
      <var range="name"/>
      <var range="nameClass"/>
    </judgement>

    <judgement name="normalized">
      <var range="mixed"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap" sub="2"/>
      <function name="emptyBag"/>
      <function name="element">
	<var range="name"/>
        <var range="namespaceMap" sub="1"/>
	<var range="att"/>
	<var range="mixed"/>
      </function>
      <element name="element">
        <var range="nameClass"/>
	<var range="pattern"/>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

  </rule>

  <rule name="attribute">

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="attval"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="belongs">
      <var range="name"/>
      <var range="nameClass"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="attribute">
        <var range="name"/>
        <function name="toString">
          <var range="attval"/>
        </function>
      </function>
      <function name="emptySequence"/>
      <element name="attribute">
        <var range="nameClass"/>
	<var range="pattern"/>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

  </rule>

  <rule name="empty">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <function name="emptySequence"/>
      <element name="empty"></element>
      <function name="emptyBag"/>
      <function name="emptyBag"/>
    </judgement>
  </rule>

  <rule name="text 1">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="string"/>
      <element name="text"></element>
      <function name="emptyBag"/>
      <function name="emptyBag"/>
    </judgement>
  </rule>

  <rule name="text 2">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="mixed"/>
      <element name="text"></element>
      <function name="emptyBag"/>
      <function name="emptyBag"/>
    </judgement>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <function name="append">
        <var range="mixed"/>
        <var range="string"/>
      </function>
      <element name="text"></element>
      <function name="emptyBag"/>
      <function name="emptyBag"/>
    </judgement>
  </rule>

  <rule name="empty string">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <function name="emptyString"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <function name="emptySequence"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
  </rule>

  <rule name="value">
    <judgement name="datatypeEqual">
      <var range="uri"/>
      <var range="ncname"/>
      <var range="string" sub="1"/>
      <var range="namespaceMap" sub="1"/>
      <var range="string" sub="2"/>
      <var range="namespaceMap" sub="2"/>
    </judgement>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap" sub="1"/>
      <function name="emptyBag"/>
      <var range="string" sub="1"/>
      <element name="value">
        <namespaceMap>
          <var range="namespaceMap" sub="2"/>
        </namespaceMap>
        <attribute name="type">
          <var range="ncname"/>
        </attribute>
        <attribute name="ns">
          <var range="uri"/>
        </attribute>
        <var range="string" sub="2"/>
      </element>
      <function name="emptyBag"/>
      <function name="emptyBag"/>
    </judgement>
  </rule>

  <rule name="data 1">
    <judgement name="datatypeAllows">
      <var range="uri"/>
      <var range="ncname"/>
      <var range="params"/>
      <var range="string"/>
      <var range="namespaceMap"/>
    </judgement>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="string"/>
      <element name="data">
        <attribute name="type">
          <var range="ncname"/>
        </attribute>
        <attribute name="datatypeLibrary">
          <var range="uri"/>
        </attribute>
        <var range="params"/>
      </element>
      <function name="emptyBag"/>
      <function name="emptyBag"/>
    </judgement>
  </rule>

  <rule name="data 2">
    <judgement name="datatypeAllows">
      <var range="uri"/>
      <var range="ncname" sub="2"/>
      <var range="params"/>
      <var range="string"/>
      <var range="namespaceMap"/>
    </judgement>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="string"/>
      <element name="data">
        <attribute name="key">
          <var range="ncname" sub="1"/>
        </attribute>
        <attribute name="type">
          <var range="ncname" sub="2"/>
        </attribute>
        <attribute name="datatypeLibrary">
          <var range="uri"/>
        </attribute>
        <var range="params"/>
      </element>
      <function name="key">
        <var range="ncname" sub="1"/>
        <var range="uri"/>
        <var range="ncname" sub="2"/>
        <var range="string"/>
        <var range="namespaceMap"/>
      </function>
      <function name="emptyBag"/>
    </judgement>
  </rule>

  <rule name="data 3">
    <judgement name="datatypeAllows">
      <var range="uri"/>
      <var range="ncname" sub="2"/>
      <var range="params"/>
      <var range="string"/>
      <var range="namespaceMap"/>
    </judgement>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="string"/>
      <element name="data">
        <attribute name="keyRef">
          <var range="ncname" sub="1"/>
        </attribute>
        <attribute name="type">
          <var range="ncname" sub="2"/>
        </attribute>
        <attribute name="datatypeLibrary">
          <var range="uri"/>
        </attribute>
        <var range="params"/>
      </element>
      <function name="emptyBag"/>
      <function name="keyref">
        <var range="ncname" sub="1"/>
        <var range="uri"/>
        <var range="ncname" sub="2"/>
        <var range="string"/>
        <var range="namespaceMap"/>
      </function>
    </judgement>
  </rule>

  <rule name="data 4">
    <judgement name="datatypeAllows">
      <var range="uri"/>
      <var range="ncname" sub="2"/>
      <var range="params"/>
      <var range="string"/>
      <var range="namespaceMap"/>
    </judgement>
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="string"/>
      <element name="data">
        <attribute name="key">
          <var range="ncname" sub="1"/>
        </attribute>
        <attribute name="keyRef">
          <var range="ncname" sub="2"/>
        </attribute>
        <attribute name="type">
          <var range="ncname" sub="3"/>
        </attribute>
        <attribute name="datatypeLibrary">
          <var range="uri"/>
        </attribute>
        <var range="params"/>
      </element>
      <function name="key">
	<var range="ncname" sub="1"/>
	<var range="uri"/>
	<var range="ncname" sub="3"/>
	<var range="string"/>
	<var range="namespaceMap"/>
      </function>
      <function name="keyref">
	<var range="ncname" sub="2"/>
	<var range="uri"/>
	<var range="ncname" sub="3"/>
	<var range="string"/>
	<var range="namespaceMap"/>
      </function>
    </judgement>
  </rule>

  <rule name="list">

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <function name="split">
        <var range="string"/>
      </function>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <function name="emptyBag"/>
      <var range="string"/>
      <element name="list">
	<var range="pattern"/>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

  </rule>

  <!-- Grammars -->

  <rule name="grammar">
    <judgement name="match">
      <function name="env">
        <var range="defs"/>
        <var range="env"/>
      </function>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <element name="grammar">
	<element name="start">
	  <var range="pattern"/>
	</element>
	<var range="defs"/>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
  </rule>

  <rule name="define">
    <judgement name="binds">
      <function name="env">
	<group>
	   <var range="defs" sub="1"/>
	   <element name="define">
	     <attribute name="name">
	       <var range="ncname"/>
	     </attribute>
	     <var range="pattern"/>
	   </element>
	   <var range="defs" sub="2"/>
	</group>
	<var range="env"/>
      </function>
      <var range="ncname"/>
      <var range="pattern"/>
    </judgement>
  </rule>


  <rule name="ref">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="binds">
      <var range="env"/>
      <var range="ncname"/>
      <var range="pattern"/>
    </judgement>

    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <element name="ref">
        <attribute name="name">
          <var range="ncname"/>
        </attribute>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
  </rule>

  <rule name="parentRef">
    <judgement name="match">
      <var range="env"/>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <var range="pattern"/>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>

    <judgement name="binds">
      <var range="env"/>
      <var range="ncname"/>
      <var range="pattern"/>
    </judgement>

    <judgement name="match">
      <function name="env">
        <var range="defs"/>
        <var range="env"/>
      </function>
      <var range="namespaceMap"/>
      <var range="att"/>
      <var range="mixed"/>
      <element name="parentRef">
        <attribute name="name">
          <var range="ncname"/>
        </attribute>
      </element>
      <var range="keybag"/>
      <var range="keyrefbag"/>
    </judgement>
  </rule>

  <!-- Rules for name classes -->

  <rule name="anyName">
    <judgement name="belongs">
      <var range="name"/>
      <element name="anyName"/>
    </judgement>
  </rule>

  <rule name="name">
    <judgement name="belongs">
      <function name="name">
        <var range="uri"/>
        <var range="ncname"/>
      </function>
      <element name="name">
        <attribute name="ns">
          <var range="uri"/>
        </attribute>
        <var range="ncname"/>
      </element>
    </judgement>
  </rule>

  <rule name="namespaceName">
    <judgement name="belongs">
      <function name="name">
        <var range="uri"/>
        <var range="ncname"/>
      </function>
      <element name="nsName">
        <attribute name="ns">
          <var range="uri"/>
        </attribute>
      </element>
    </judgement>
  </rule>

  <rule name="name choice 1">
    <judgement name="belongs">
      <var range="name"/>
      <var range="nameClass" sub="1"/>
    </judgement>
    <judgement name="belongs">
      <var range="name"/>
      <element name="choice">
        <var range="nameClass" sub="1"/>
        <var range="nameClass" sub="2"/>
      </element>
    </judgement>
  </rule>

  <rule name="name choice 2">
    <judgement name="belongs">
      <var range="name"/>
      <var range="nameClass" sub="2"/>
    </judgement>
    <judgement name="belongs">
      <var range="name"/>
      <element name="choice">
        <var range="nameClass" sub="1"/>
        <var range="nameClass" sub="2"/>
      </element>
    </judgement>
  </rule>

  <rule name="difference">
    <judgement name="belongs">
      <var range="name"/>
      <var range="nameClass" sub="1"/>
    </judgement>
    <not>
      <judgement name="belongs">
	<var range="name"/>
	<var range="nameClass" sub="2"/>
      </judgement>
    </not>
    <judgement name="belongs">
      <var range="name"/>
      <element name="difference">
        <var range="nameClass" sub="1"/>
        <var range="nameClass" sub="2"/>
      </element>
    </judgement>
  </rule>

  <rule name="key">
    <judgement name="datatypeEqual">
      <var range="uri"/>
      <var range="ncname" sub="2"/>
      <var range="string" sub="1"/>
      <var range="namespaceMap" sub="1"/>
      <var range="string" sub="2"/>
      <var range="namespaceMap" sub="2"/>
    </judgement>
    <judgement name="subset">
      <function name="union">
	<function name="key">
	  <var range="ncname" sub="1"/>
	  <var range="uri"/>
	  <var range="ncname" sub="2"/>
	  <var range="string" sub="1"/>
	  <var range="namespaceMap" sub="1"/>
	</function>
	<function name="key">
	  <var range="ncname" sub="1"/>
	  <var range="uri"/>
	  <var range="ncname" sub="2"/>
	  <var range="string" sub="2"/>
	  <var range="namespaceMap" sub="2"/>
	</function>
      </function>
      <var range="keybag"/>
    </judgement>
    <judgement name="keyConflict">
      <var range="keybag"/>
    </judgement>
  </rule>

  <rule name="keyref 1">
    <judgement name="keyComplete">
      <function name="union">
	<var range="keybag"/>
	<function name="key">
	  <var range="ncname" sub="1"/>
	  <var range="uri"/>
	  <var range="ncname" sub="2"/>
	  <var range="string" sub="1"/>
	  <var range="namespaceMap" sub="1"/>
	</function>
      </function>
      <var range="keyrefbag"/>
    </judgement>
    <judgement name="datatypeEqual">
      <var range="uri"/>
      <var range="ncname" sub="2"/>
      <var range="string" sub="1"/>
      <var range="namespaceMap" sub="1"/>
      <var range="string" sub="2"/>
      <var range="namespaceMap" sub="2"/>
    </judgement>
    <judgement name="keyComplete">
      <function name="union">
	<var range="keybag"/>
	<function name="key">
	  <var range="ncname" sub="1"/>
	  <var range="uri"/>
	  <var range="ncname" sub="2"/>
	  <var range="string" sub="1"/>
	  <var range="namespaceMap" sub="1"/>
	</function>
      </function>
      <function name="union">
	<var range="keyrefbag"/>
	<function name="keyref">
	  <var range="ncname" sub="1"/>
	  <var range="uri"/>
	  <var range="ncname" sub="2"/>
	  <var range="string" sub="2"/>
	  <var range="namespaceMap" sub="2"/>
	</function>
      </function>
    </judgement>
  </rule>

  <rule name="keyref 2">
    <judgement name="keyComplete">
      <var range="keybag"/>
      <function name="emptyBag"/>
    </judgement>
  </rule>

</proofSystem>
