

<!-- @version CVS $Id -->

<!--
 PUBLIC "-//OASIS//DTD DocBook XML V4.2CR1//EN"
                    "docbook/docbookx.dtd"

olga's setup for editing with emacs
SYSTEM "dtds/docbookx.dtd"
-->
<!DOCTYPE book 
[
<!-- 
 docbook customisations:
    add MathML
    allow sidebar in figures (used for change log)
    add author attribute to sidebar
    add xml:space (to correct for IE bug, dropping spaces)
-->
<!ENTITY % inlineobj.char.class	"math">
<!ENTITY % local.figure.mix "|sidebar">
<!ATTLIST sidebar author CDATA #IMPLIED>
<!ATTLIST book xml:space (default|preserve) #IMPLIED >
<!--
  MathML DTD (somewhat simplified)
-->
<!ELEMENT math (mrow|mn|mi|mo|msub|msup|mtext|mspace|mfrac)+>
<!--
  IE Bug doesn't allow this, so switch to mml namespace via stylesheet
  xmlns CDATA #FIXED "http://www.w3.org/1998/Math/MathML" 
-->
<!ATTLIST math
  display CDATA #IMPLIED
  class CDATA #IMPLIED
  revisionflag CDATA #IMPLIED
>
<!ELEMENT mrow (mrow|mn|mi|mo|msub|msup|mtext|mspace|mfrac|varname|systemitem)+>
<!ELEMENT mn (#PCDATA)>
<!ELEMENT mi (#PCDATA)>
<!ATTLIST mi
  mathcolor CDATA #IMPLIED
  mathvariant (bold) #IMPLIED>
<!ELEMENT mo (#PCDATA)>
<!ATTLIST mo
  fence CDATA #IMPLIED
  separator CDATA #IMPLIED>
<!ELEMENT msup ((mn|mi|mo|mrow),(mn|mi|mo|mrow))>
<!ELEMENT msub ((mn|mi|mo|mrow),(mn|mi|mo|mrow))>
<!ELEMENT mfrac ((mn|mi|mo|mrow),(mn|mi|mo|mrow))>
<!ELEMENT mtext (#PCDATA)>
<!ELEMENT mspace EMPTY>
<!ATTLIST mspace width CDATA #IMPLIED>

<!--
  Abbreviations used in this document
-->
<!ENTITY OM "<emphasis>OpenMath</emphasis>">
<!ENTITY exml "<acronym>xml</acronym>">


<!ENTITY digits "0-9">
<!ENTITY exadigits "0-9A-F">
<!ENTITY lcalpha "a-z">
<!ENTITY ucalpha "A-Z">
<!ENTITY sign "[+-]"><!-- dpc: Correct regxp for + or - -->
<!ENTITY zsp "">
<!ENTITY longrightarrow "<mo>&#8594;</mo>"><!--dpc: short, actually -->

<!ENTITY varnamechar "+=(),-./:?!#$&#37;*;@[]^_`{|}"><!-- dpc: remove `TeX error?  -->

<!ENTITY omrnc SYSTEM "openmath2rnc.xml">
<!ENTITY cdrnc SYSTEM "omcd2rnc.xml">
<!ENTITY sigrnc SYSTEM "omcdsig2rnc.xml">
<!ENTITY cdgrouprnc SYSTEM "omcdgroup2rnc.xml">

<!ENTITY omxsd SYSTEM "openmath2.xsd">
<!ENTITY omdtd SYSTEM "openmath2dtd.xml">
<!ENTITY omrng SYSTEM "openmath2.rng">
<!ENTITY cdrng SYSTEM "omcd2.rng">
<!ENTITY sigrng SYSTEM "omcdsig2.rng">


]>
<book xml:space="preserve">
<title>The &OM; Standard</title>
<bookinfo>
<releaseinfo>2.0 Public Draft 2 (31 October 2003)</releaseinfo>
<author><firstname>The &OM; Society</firstname></author>


<editor><firstname>S.</firstname><surname>Buswell</surname></editor>
<editor><firstname>O.</firstname><surname>Caprotti</surname></editor>
<editor><firstname>D.</firstname><othername>P.</othername><surname>Carlisle</surname></editor>
<editor><firstname>M.</firstname><othername>C.</othername><surname>Dewar</surname></editor>
<editor><firstname>M.</firstname><surname>Gaetano</surname></editor>
<editor><firstname>M.</firstname><surname>Kohlhase</surname></editor>
<date>October 2003</date>

<copyright>
<year>2000&#8211;2003</year>
<holder>The OpenMath Society</holder>
</copyright>

<abstract>
<para>This document proposes &OM; as a standard for the communication of
  semantically rich mathematical objects. This draft of the &OM; 
  standard comprises the following: a description of &OM; objects, the
  grammar of &exml; and of the binary encoding of objects, a
  description of Content Dictionaries and an &exml; document type
  definition for validating Content Dictionaries. The non-normative
  <xref linkend="cha_his"/> of this document briefly overviews the history
  of &OM;.</para>
</abstract>
</bookinfo>
  
<toc/>
<lot><title>List of Figures</title></lot>

<chapter id="cha_his">
<title>&OM; Movement</title>
<sidebar revision="1999/08/24" author="OC"><para>Changed title</para></sidebar>

<para>This chapter is a historical account of &OM; and should be regarded
as non-normative.</para>

<para>&OM; is a standard for representing mathematical objects,
allowing them to be exchanged between computer programs, stored in
databases, or published on the worldwide web.  While the original
designers were mainly developers of computer algebra systems, it is
now attracting interest from other areas of scientific computation and
from many publishers of electronic documents with a significant
mathematical content.  There is a strong relationship to the MathML
recommendation <citation>MathML_2000</citation> from the Worldwide Web
Consortium, and a large overlap between the two developer communities.
MathML deals principally with the <emphasis>presentation</emphasis> of
mathematical objects, while &OM; is solely concerned with their
semantic meaning or <emphasis>content</emphasis>.  While MathML does
have some limited facilities for dealing with content, it also allows
semantic information encoded in &OM; to be embedded inside a MathML
structure.  Thus the two technologies may be seen as highly
complementary.</para>

<section id="sec_hist">
<title>History</title>

<sidebar revision="1999/07/16" author="DPC">
<para>Reword to reflect birth of&OM;Society</para>
</sidebar>
<para>&OM; was originally developed through a series of workshops held
in Zurich (1993 and 1996), Oxford (1994), Amsterdam (1995), Copenhagen
(1995), Bath (1996), Dublin (1996), Nice (1997), Yorktown Heights
(1997), Berlin (1998), and Tallahassee (1998).  The participants in
these workshops formed a global &OM; community which was coordinated
by a Steering Committee and operated through electronic mailing groups
and ad-hoc working parties.  This loose arrangement has been
formalised through the establishment of an &OM; Society.  Up until the
end of 1996 much of the work of the community was funded through a
grant from the Human Capital and Mobility program of the European
Union, the contributions of several institutions and individuals.  A
document outlining the objectives and basic design of &OM; was
produced (later published as
<citation>Abbott_Leeuwen_Strotmann_98</citation>).  By the end of 1996
a simplified specification had been agreed on and some prototype
implementations have come about
<citation>Dalmas_Gaetano_Watt_97</citation>.</para>

<sidebar revision="1999/07/16" author="DPC">
<para>Extend History slightly</para>
</sidebar>
<para>In 1996 a group of European participants in &OM; decided to bid
for funding under the European Union's Fourth Framework Programme for
strategic research in information technology.  This bid was successful
and the project started in late 1997.  The principal aims of the
project are to formalise &OM; as a standard and to develop it
further through industrial applications; this document is a product of
that process and draws heavily on the previous work described earlier.
&OM; participants from all over the world continue to meet
regularly and cooperate on areas of mutual interest, and
recent workshops in Tallahassee (November 1998) and Eindhoven (June
1999)  endorsed  drafts of this document as the current &OM; standard.</para>



<sidebar revision="1999/07/16" author="DPC"><para>Final conclusion paragraph removed</para></sidebar>
</section>

<section id="sec_omsoc">
<title>&OM; Society</title>

<sidebar revision="1999/08/24" author="OC">
<para>New section</para>
</sidebar>
<para>In November 1998 the &OM; Society has been established to coordinate
all &OM; activities. The society is based in Helsinki, Finland and is
steered by the executive committee whose members are elected by the
society. The official web page of the society is
<ulink url="http://www.openmath.org">http://www.openmath.org</ulink>.</para>
</section>

</chapter>

<chapter id="cha_int">
<title>Introduction to &OM;</title>




<para>This chapter briefly introduces &OM; concepts and notions that are
referred to in the rest of this document.</para>

<section id="sec_om-arch">
<title>&OM; Architecture</title>


<figure id="fig_om">
    <title>The &OM; Architecture</title>
    <graphic fileref="om-arch" depth="500" width="700"/>
</figure>

<para>The architecture of &OM; is described in <xref
linkend="fig_om"/> and summarizes the interactions among the different
&OM; components.  There are three layers of representation of a
mathematical object <citation>OM_98</citation>. A private layer that
is the internal representation used by an application.  An abstract
layer that is the representation as an &OM; object. Third is a
communication layer that translates the &OM; object representation to
a stream of bytes. An application dependent program manipulates the
mathematical objects using its internal representation, it can convert
them to &OM; objects and communicate them by using the byte stream
representation of &OM; objects.</para>
</section>

<section id="sec_intro-obj">
<title>&OM; Objects and Encodings</title>


<sidebar revision="1999/08/26" author="OC"><para>Moved this section
up, to mirror chapter sequence</para></sidebar>


<para>&OM; objects are representations of mathematical entities that
can be communicated among various software applications in a
meaningful way, that is, preserving their
<quote>semantics</quote>.</para>

<para>&OM; objects and encodings are described in detail in <xref
linkend="cha_obj"/> and <xref linkend="cha_enco"/>.</para>


<sidebar revision="1999/08/24" author="OC"><para>Note on encodings and
possibility of other encodings</para></sidebar>

<para>The standard endorses encodings in &exml; and binary
format. These are the encodings supported by the official &OM;
libraries. However they are not the only possible encodings of &OM;
objects. Users that wish to define their own encoding using some other
specific language (e.g.  Lisp) may do so provided there is an
effective translation of this encoding to an official one.</para>
</section>

<section id="sec_intro-cd">
<title>Content Dictionaries</title>


<para>Content Dictionaries (CDs) are used to assign informal and formal
semantics to all symbols used in the &OM; objects. They define the
symbols used to represent concepts arising in a particular area of
mathematics.</para>

<para>The Content Dictionaries are public, they represent the actual
common knowledge among &OM; applications.  Content Dictionaries fix
the <quote>meaning</quote> of objects independently of the
application.  The application receiving the object may then recognize
whether or not, according to the semantics of the symbols defined in
the Content Dictionaries, the object can be transformed to the
corresponding internal representation used by the application.</para>
</section>

<section id="sec_addnfiles">
<title>Additional Files</title> <sidebar revision="1999/06/23"
author="OC"><para>This is new</para></sidebar> <para>Several
additional files are related to Content Dictionaries.  Signature files
contain the signatures of symbols defined in some &OM; Content
Dictionary and their format is endorsed by this standard.</para>

<para>Furthermore, the standard fixes how to define as a CDGroup a specific
set of Content Dictionaries.</para>

<para>Auxiliary files that define presentation and rendering or that
are used for manipulating and processing Content Dictionaries are not
discussed by the standard.</para>

<sidebar revision="1999/10/01" author="OC"><para>Removed mention to
DefMP files</para></sidebar>
</section>
<section id="sec_phrasebooks">
<title>Phrasebooks</title>



<para>The conversion of an &OM; object to/from the internal
representation in a software application is performed by an interface
program called <emphasis>Phrasebook</emphasis>. The translation is
governed by the Content Dictionaries and the specifics of the
application. It is envisioned that a software application dealing with
a specific area of mathematics declares which Content Dictionaries it
understands. As a consequence, it is expected that the Phrasebook of
the application is able to translate &OM; objects built using symbols
from these Content Dictionaries to/from the internal mathematical
objects of the application.</para>

<sidebar revision="2000/04/10"
author="DPC"><para>Reword</para></sidebar> <para>&OM; objects do not
specify any computational behaviour, they merely represent mathematical
expressions.  Part of the &OM; philosophy is to leave it to the
application to decide what it does with an object once it has received
it.  &OM; is not a query or programming language. Because of this,
&OM; does not prescribe a way of forcing <quote>evaluation</quote> or
<quote>simplification</quote> of objects like
<math><mn>2</mn><mo>+</mo><mn>3</mn></math> or
<math><mi>sin</mi><mo>(</mo><mi>&#960;</mi><mo>)</mo></math>. Thus,
the same object <math><mn>2</mn><mo>+</mo><mn>3</mn></math> could be
transformed to <math><mn>5</mn></math> by a computer algebra system,
or displayed as <math><mn>2</mn><mo>+</mo><mn>3</mn></math> by a
typesetting tool.</para>
</section>
</chapter>

<chapter id="cha_obj">
<title>&OM; Objects</title>


<sidebar revision="1999/08/24" author="OC">
<para>Reshuffled the sections on &OM; Objects</para>
</sidebar>
<para>In this chapter we provide a self-contained description of &OM;
objects. We first do so at an informal level (<xref
linkend="sec_omin"/>) and next by means of an abstract grammar
description (<xref linkend="sec_omabs"/>).</para>


<section id="sec_omabs">
<title>Formal Definition of &OM; Objects</title>

<sidebar revision="1999/07/16" author="DPC">
<para>Restructure the definition of &OM; Objects</para>
</sidebar>
<para>&OM; represents mathematical objects as terms or as labelled
trees that are called &OM; objects or &OM; expressions. The definition
of an abstract &OM; object is then the following.</para>


<section id="sec_basic">
<title>Basic &OM; objects</title> <para>The Basic &OM; Objects form
the leaves of the &OM; Object tree.  A Basic &OM; Object is of one of
the following.</para> <sidebar revision="1999/09/10"
author="DPC"><para>Expand descriptions of basic
objects</para></sidebar>
<itemizedlist>
<listitem><para><phrase>(i)</phrase> Integer.</para> <para>Integers in
  the mathematical sense, with no predefined range.  They are
  <quote>infinite precision</quote> integers (also called
  <quote>bignums</quote> in computer algebra).</para>

</listitem>
<listitem><para><phrase>(ii)</phrase> IEEE floating point
    number.</para> <para>Double precision floating-point numbers
    following the <acronym>ieee</acronym> 754-1985
    standard&#160;<citation>ieee754_85</citation>.</para>

</listitem>
<listitem><para><phrase>(iii)</phrase> Character string.</para>

 <para>A Unicode Character string. This also corresponds to `characters' in
  &exml;.</para>

</listitem>
<listitem><para><phrase>(iv)</phrase> Bytearray.</para>

 <para>A sequence of bytes.</para>

</listitem>
<listitem><para><phrase>(v)</phrase> Symbol.</para>
<para revisionflag="deleted">A Symbol
encodes two fields of information, a <emphasis>name</emphasis> and a
<emphasis>Content Dictionary</emphasis>. Each is a sequence of
characters matching a regular expression, as described below.</para>

<para revisionflag="added">A Symbol encodes three fields of
information, a <emphasis>name</emphasis>, a <emphasis>Content
Dictionary</emphasis>, and (optionally) a role.  The name of a symbol
is a sequence of characters matching the regular expression described
in <xref linkend="sec_names"/>.  The Content Dictionary is the
location of the definition of the symbol, consisting of a name (a
sequence of characters matching the regular expression described in
<xref linkend="sec_names"/>) and, optionally, a unique prefix called
a <emphasis>cdbase</emphasis> which is used to
disambiguate multiple Content Dictionaries of the same name.  The role
is a restriction on where the symbol may appear in an &OM; object.
The possible roles are described in <xref linkend="sec_roles"/>.

</para>

</listitem>
<listitem><para><phrase>(vi)</phrase> Variable.</para>


<para>A Variable <phrase revisionflag="deleted">consists of</phrase>
<phrase revisionflag="added">must have</phrase> a
<emphasis>name</emphasis> which is a sequence of characters matching a
regular expression, as described in <xref linkend="sec_names"/>.
<phrase revisionflag="added">Where the variable is a member of an
enumerated set it also has a child which is an &OM; object
representing its indices.  </phrase></para>

</listitem>
</itemizedlist>
</section>

<section id="sec_derived" revisionflag="added">
<title>Derived &OM; Objects</title>

<para>A derived &OM; object is built as follows: 
<itemizedlist>
<listitem><para><phrase>(i)</phrase> If <math><mi>A</mi></math> is
<emphasis>not</emphasis> an &OM; object, then <math><mi
mathvariant="bold">foreign</mi><mfenced><mi>A</mi></mfenced></math> is an &OM;
<emphasis>foreign object</emphasis>.</para> 
</listitem>
</itemizedlist>
</para>
</section>

<section id="sec_compound">
<title>Compound &OM; Objects</title>
  
<para>&OM; objects are built recursively as follows.
<itemizedlist>
<listitem><para><phrase>(i)</phrase> Basic &OM; objects are &OM; objects.
<phrase revisionflag="added">Derived &OM; objects are <emphasis>not</emphasis>
&OM; objects.</phrase></para>
</listitem>

<listitem>
  <para>
    <phrase>(ii)</phrase> If
    <math><msub><mi>A</mi><mn>1</mn></msub></math>,
    <phrase>&#8230;</phrase>,
    <math><msub><mi>A</mi><mi>n</mi></msub></math>
    <math><mo>(</mo><mi>n</mi><mo>&gt;</mo><mn>0</mn><mo>)</mo></math>
    are &OM; objects, then
  <math display="block">
  <mi mathvariant="bold">application</mi><mo>(</mo><msub><mi>A</mi><mn>1</mn></msub><mo>,</mo> <mi>&#8230;</mi><mo>,</mo> <msub><mi>A</mi><mi>n</mi></msub><mo>)</mo>
  </math>
  is an &OM; <emphasis>application object</emphasis>.</para>
    
<sidebar revision="1999/08/24" author="OC"><para>Cleaned up
Attribution</para></sidebar> </listitem> <listitem><para><phrase>(iii)</phrase> If
  <math><msub><mi>S</mi><mn>1</mn></msub><mo>,</mo>
  <mi>&#8230;</mi><mo>,</mo> <msub><mi>S</mi><mi>n</mi></msub></math>
  are &OM; symbols, and
<phrase revisionflag="deleted">
<math><mi>A</mi></math>,
  <math><msub><mi>A</mi><mn>1</mn></msub></math>,
  <phrase>&#8230;</phrase>, <math><msub><mi>A</mi><mi>n</mi></msub></math>, <math><mo>(</mo><mi>n</mi><mo>&gt;</mo><mn>0</mn><mo>)</mo></math> are &OM; objects, then
</phrase>
<phrase revisionflag="added">
<math><mi>A</mi></math> is an &OM; object, and
  <math><msub><mi>A</mi><mn>1</mn></msub></math>,
  <phrase>&#8230;</phrase>, <math><msub><mi>A</mi><mi>n</mi></msub></math>, <math><mo>(</mo><mi>n</mi><mo>&gt;</mo><mn>0</mn><mo>)</mo></math> are &OM; objects or &OM; derived objects, then
</phrase>

  <math display="block"><mi mathvariant="bold">attribution</mi>
  <mo>(</mo><mi>A</mi><mo>,</mo> <msub><mi>S</mi><mn>1</mn></msub>
  <mspace width=".3em"/> <msub><mi>A</mi><mn>1</mn></msub><mo>,</mo>
  <mspace width=".3em"/> <mi>&#8230;</mi> <mspace width=".3em"/>
  <mo>,</mo> <msub><mi>S</mi><mi>n</mi></msub> <mspace width=".3em"/>
  <msub><mi>A</mi><mi>n</mi></msub><mo>)</mo></math> is an &OM;
  <emphasis>attribution object</emphasis>. 

  <phrase revisionflag="deleted">and</phrase> <math><mi>A</mi></math>
  is the object <emphasis>stripped of attributions</emphasis>. <phrase
  revisionflag="added">
  <math><msub><mi>S</mi><mn>1</mn></msub><mo>,</mo>
  <mi>&#8230;</mi><mo>,</mo> <msub><mi>S</mi><mi>n</mi></msub></math>
  are referred to as <emphasis>keys</emphasis> and
  <math><msub><mi>A</mi><mn>1</mn></msub></math>,
  <phrase>&#8230;</phrase>,
  <math><msub><mi>A</mi><mi>n</mi></msub></math> as their associated
  <emphasis>values</emphasis></phrase>. The operation of recursively
  applying stripping to the stripped object is called
  <emphasis>flattening of the attribution</emphasis>.

		  When the stripped object after flattening is a
  variable, the attributed object is called <emphasis>attributed
  variable</emphasis>.</para>
</listitem>

<listitem><para><phrase>(iv)</phrase> If <math><mi>B</mi></math> and
  <math><mi>C</mi></math> are &OM; objects, and
  <math><msub><mi>v</mi><mn>1</mn></msub></math>,
  <math><mi>&#8230;</mi></math>,
  <math><msub><mi>v</mi><mi>n</mi></msub></math>
  <math><mo>(</mo><mi>n</mi> <mo>&#8805;</mo>
  <mn>0</mn><mo>)</mo></math> are &OM; variables or attributed
  variables, then
  <math display="block">
  <mi mathvariant="bold">binding</mi> <mo>(</mo><mi>B</mi><mo>,</mo> <msub><mi>v</mi><mn>1</mn></msub><mo>,</mo> <mi>&#8230;</mi><mo>,</mo> <msub><mi>v</mi><mi>n</mi></msub><mo>,</mo> <mi>C</mi><mo>)</mo>
  </math>
is an &OM; <emphasis>binding object</emphasis>.</para>

</listitem>
<listitem><para><phrase>(v)</phrase> If <math><mi>S</mi></math> is an
&OM; symbol and <math><msub><mi>A</mi><mn>1</mn></msub></math>,
<phrase>&#8230;</phrase>,
<math><msub><mi>A</mi><mi>n</mi></msub></math>
<math><mo>(</mo><mi>n</mi> <mo>&#8805;</mo>
<mn>0</mn><mo>)</mo></math> are &OM; objects, then <math
display="block"><mi mathvariant="bold">error</mi>
<mo>(</mo><mi>S</mi><mo>,</mo>
<msub><mi>A</mi><mn>1</mn></msub><mo>,</mo><mi>&#8230;</mi><mo>,</mo><msub><mi>A</mi><mi>n</mi></msub><mo>)</mo>
  </math>
  is an &OM; <emphasis>error object</emphasis>.</para>
</listitem>
</itemizedlist>
</para>
</section>

<section id="sec_roles" revisionflag="added">
<title>&OM; Symbol Rôles</title>

<para>The <emphasis>rôle</emphasis> of an &OM; symbol is a restriction
on where it can appear in an &OM; object.  A symbol cannot have more
than one role.  If no role is indicated
then the symbol can be used anywhere.  Possible roles are:
<orderedlist numeration="lowerroman">

<listitem><para><emphasis>binder</emphasis> The symbol may only
appear as the first child of an &OM; binding object.
</para></listitem>

<listitem><para> <emphasis>attribution</emphasis> The symbol may only
be used as key in an &OM; attribution object, i.e. as the first
element of a key-value pair, or in an equivalent context (for example
to refer to the value of an attribution).  This form of attribution
may be ignored by an application, so should be used for information
which does not change the meaning of the attributed &OM; object.
</para></listitem> 

<listitem><para> <emphasis>semantic-attribution</emphasis> This is the
same as <emphasis>attribution</emphasis> except that it modifies the
meaning of the attributed &OM; object and thus cannot be ignored by an
application.  </para></listitem> 

<listitem><para> <emphasis>error</emphasis> The symbol can only appear
as the first child of an &OM; error object.  </para></listitem>
<listitem><para> <emphasis>default</emphasis> The symbol can appear
anywhere not defined in the previous four cases.  </para></listitem>
</orderedlist>
</para>
</section>

</section>
<section id="sec_omin">
<title>Further Description of &OM; Objects</title>


<sidebar revision="1999/08/24" author="OC"><para>Condensed Informal and Notes</para></sidebar>
  
<sidebar revision="2000/04/10" author="DPC">
<para>Add integer and float</para>
</sidebar>
<para>Informally, an &OM; <phrase role="sl">object</phrase> can be
viewed as a tree and is also referred to as a term.  The objects at
the leaves of &OM; trees are called <phrase role="sl">basic
objects</phrase>.  The basic objects supported by &OM; are:
<variablelist>
<varlistentry><term>Integer</term><listitem><para>Arbitrary Precision
integers.</para> </listitem></varlistentry>
<varlistentry><term>Float</term><listitem> <para>&OM; floats are
<acronym>ieee</acronym> 754 Double precision floating-point
numbers. Other types of floating point number may be encoded in &OM;
by the use of suitable content dictionaries.</para>
  
</listitem>
</varlistentry>
<varlistentry><term>Character strings</term><listitem><para>are
  sequences of characters. These characters come from the Unicode
  standard&#160;<citation>UNICODE</citation>.</para>
  
</listitem></varlistentry>
<varlistentry><term>Bytearrays</term><listitem><para>are sequences of
bytes. There is no <quote>byte</quote> in &OM; as an object of its
own. However, a single byte can of course be represented by a
bytearray of length 1.  The difference between strings and bytearrays
is the following: a character string is a sequence of bytes with a
fixed interpretation (as characters, Unicode texts may require several
bytes to code one character), whereas a bytearray is an uninterpreted
sequence of bytes with no intrinsic meaning.  Bytearrays could be used
inside &OM; errors to provide information to, for example, a debugger;
they could also contain intermediate results of calculations, or
`handles' into computations or databases.</para>
</listitem>
</varlistentry>
<varlistentry><term>Symbols</term><listitem>
  <sidebar revision="2000/04/10" author="DPC"><para>Change Example</para></sidebar>
  <sidebar revision="1999/09/10" author="DPC"><para>Remove ' from regexp</para></sidebar>
  <para>
 are uniquely defined by the Content Dictionary in which they occur
  and by a name.
<phrase revisionflag="deleted">In definition in <xref linkend="sec_omabs"/> we have
  left this information implicit. However, it should be kept in mind
  that all symbols appearing in an &OM; object are defined in a
  Content Dictionary.
</phrase>The form of these definitions is explained in
  <xref linkend="cha_cd"/>.  Each symbol has no more than one
  definition in a Content Dictionary. Many Content Dictionaries may
  define differently a symbol with the same name (e.g. the symbol
  <systemitem>union</systemitem> is defined as
  associative-commutativeset theoretic union in a Content Dictionary
  <systemitem>set1</systemitem> but another Content Dictionary,
  <systemitem>multiset1</systemitem> might define a symbol
  <systemitem>union</systemitem> as the union of multi-sets).
<phrase revisionflag="deleted">The name
  of a symbol can only contain alphanumeric characters and
  underscores.  More precisely, a symbol name matches the following
  regular expression:
<blockquote><para>
  [<systemitem>A</systemitem>-<systemitem>Z</systemitem><systemitem>a</systemitem>-<systemitem>z</systemitem>]
  [<systemitem>A</systemitem>-<systemitem>Z</systemitem><systemitem>a</systemitem>-<systemitem>z</systemitem><systemitem>0</systemitem>-<systemitem>9</systemitem><systemitem>_</systemitem>]*
  </para></blockquote>
  <para>Notice that these symbol names are case sensitive.  &OM;
  <emphasis>recommends</emphasis> that symbol names should be no longer than
  100 characters.</para>
</phrase>
</para>
  
 <sidebar revision="1999/09/10" author="DPC"><para>Removed suggestion to utf7 hint variable names</para></sidebar>
  </listitem>
</varlistentry>
<varlistentry><term>Variables</term><listitem><para>are meant to
  denote parameters, variables or indeterminates (such as bound
  variables of function definitions, variables in summations and
  integrals, independent variables of derivatives).  <phrase
  revisionflag="deleted">Plain variable names are restricted to use a
  subset of the printable ASCII characters.  Formally the names must
  match the regular expression: <blockquote><para>
  [A-Za-z0-9=+(),-./:?!#$%*;=@[]^_`{|}]+ </para></blockquote></phrase>
</para>
<para revisionflag="added">
A variable may have one or more children which are themselves &OM;
objects and are treated as scripts.  Thus it is possible to create a
variable with cardinality such as
<math><msub><mi>x</mi><mn>1</mn></msub></math> or
<math><msub><mi>x</mi><mi>i</mi></msub></math>.
</para>
</listitem>
</varlistentry>
</variablelist> </para>

<phrase revisionflag="added">
<para>Currently there is one way of making a
derived &OM; object.</para>

<variablelist>
<varlistentry><term>Foreign</term><listitem><para>is used to import a
non-&OM; object into an &OM; attribution.  Examples of its use could
be to annotate a formula with a visual or aural rendering, an
animation etc.
</para>
</listitem>
</varlistentry>
</variablelist>
</phrase>

<para>The four following constructs can be used to make compound
 &OM; objects.</para>
<variablelist>
<varlistentry><term>Application</term><listitem><para>constructs an
  &OM; object from a sequence of one or more &OM; objects. The first
  argument of application is referred to as <quote>head</quote> while
  the remaining objects are called <quote>arguments</quote>.  An &OM;
  application object can be used to convey the mathematical notion of
  application of a function to a set of arguments.  For instance,
  suppose that the &OM; symbol <math><mi>sin</mi></math> is defined in
  a Content Dictionary for trigonometry, then <math><mi
  mathvariant="bold">application</mi><mo>(</mo><mi>sin</mi><mo>,</mo>
  <mi>x</mi> <mo>)</mo></math> is the abstract &OM; object
  corresponding to <math><mi>sin</mi> <mo>(</mo><mi>x</mi>
  <mo>)</mo></math>.  More generally, an &OM; application object can
  be used as a constructor to convey a mathematical object built from
  other objects such as a polynomial constructed from a set of
  monomials.  Constructors build inhabitants of some symbolic type,
  for instance the type of rational numbers or the type of
  polynomials.  The rational number, usually denoted as
  <math><mn>1</mn><mo>/</mo><mn>2</mn></math>, is represented by the
  &OM; application object <math><mi
  mathvariant="bold">application</mi><mo>(</mo><mi>Rational</mi><mo>,</mo>
  <mn>1</mn><mo>,</mo> <mn>2</mn><mo>)</mo></math>. The symbol
  <math><mi>Rational</mi></math> must be defined, by a Content
  Dictionary, as a constructor symbol for the rational numbers.</para>
   
<figure id="fig_obj">
    <title>The &OM; application and binding objects for
<math><mi>sin</mi> <mo>(</mo><mi>x</mi> <mo>)</mo></math> and
<math><mi>&#955;</mi> <mi>x</mi><mo>.</mo><mi>x</mi> <mo>+</mo>
<mn>2</mn></math> in tree-like notation.</title> <sidebar
revision="1999/10/21" author="OC"><para>New tree figure, suggested by
Andreas Strotmann</para></sidebar> <graphic fileref="lambda"
width="600" depth="190"/>
</figure>

  
</listitem>
</varlistentry>
<varlistentry><term>Binding</term><listitem><para>objects are
  constructed from an &OM; object, and from a sequence of zero or more
  variables followed by another &OM; object.  The first &OM; object is
  the <quote>binder</quote> object. Arguments 2 to
  <math><mi>n</mi><mo>-</mo><mn>1</mn></math> are always variables to
  be bound in the <quote>body</quote> which is the
  <math><msup><mi>n</mi><mi>th</mi></msup></math> argument object. It
  is allowed to have no bound variables, but the binder object and the
  body should be present. Binding can be used to express functions or
  logical statements.  The function <math><mi>&#955;</mi>
  <mi>x</mi><mo>.</mo><mi>x</mi> <mo>+</mo><mn>2</mn></math>, in which
  the variable <math><mi>x</mi></math> is bound by
  <math><mi>&#955;</mi></math>, corresponds to a binding object having
  as binder the &OM; symbol <math><mi>lambda</mi></math>: <math
  display="block"><mi
  mathvariant="bold">binding</mi><mo>(</mo><mi>lambda</mi><mo>,</mo>
  <mi>x</mi> <mo>,</mo> <mi
  mathvariant="bold">application</mi><mo>(</mo><mi>plus</mi><mo>,</mo>
  <mi>x</mi> <mo>,</mo>
  <mn>2</mn><mo>)</mo><mo>)</mo><mtext>.</mtext></math></para>
  
  
  


<para>Phrasebooks are allowed to use <math><mi>&#945;</mi></math>
  conversion in order to avoid clashes of variable names. Suppose an
  object <math><mi>&#937;</mi></math> contains an occurrence of the
  object <math><mi mathvariant="bold">binding</mi>
  <mo>(</mo><mi>B</mi> <mo>,</mo> <mi>v</mi> <mo>,</mo> <mi>C</mi>
  <mo>)</mo></math>.  This object <math><mi
  mathvariant="bold">binding</mi> <mo>(</mo><mi>B</mi> <mo>,</mo>
  <mi>v</mi> <mo>,</mo> <mi>C</mi> <mo>)</mo></math> can be replaced
  in <math><mi>&#937;</mi></math> by <math><mi
  mathvariant="bold">binding</mi> <mo>(</mo><mi>B</mi> <mo>,</mo>
  <mi>z</mi> <mo>,</mo> <mi>C'</mi><mo>)</mo></math> where
  <math><mi>z</mi></math> is a variable not occurring free in
  <math><mi>C</mi></math> and <math><mi>C'</mi></math> is obtained
  from <math><mi>C</mi></math> by replacing each free (i.e., not bound
  by any intermediate <varname>binding</varname> construct) occurrence
  of <math><mi>v</mi></math> by <math><mi>z</mi></math>.  This
  operation preserves the semantics of the object
  <math><mi>&#937;</mi></math>. In the above example, a phrasebook is
  thus allowed to transform the object to, e.g.  <math revisionflag="deleted"
  display="block"><mi mathvariant="bold">binding</mi>
  <mo>(</mo><mi>lambda</mi><mo>,</mo> <mi>v</mi> <mo>,</mo> <mi
  mathvariant="bold">binding</mi> <mo>(</mo><mi>lambda</mi><mo>,</mo>
  <mi>z</mi> <mo>,</mo><mi mathvariant="bold">application</mi>
  <mo>(</mo><mi>times</mi><mo>,</mo><mi>z</mi>
  <mo>,</mo><mi>z</mi><mo>)</mo><mo>)</mo><mo>)</mo><mtext>.</mtext></math>
  <math revisionflag="added" display="block"><mi
  mathvariant="bold">binding</mi><mo>(</mo><mi>lambda</mi><mo>,</mo>
  <mi>z</mi> <mo>,</mo> <mi
  mathvariant="bold">application</mi><mo>(</mo><mi>plus</mi><mo>,</mo>
  <mi>z</mi> <mo>,</mo>
  <mn>2</mn><mo>)</mo><mo>)</mo><mtext>.</mtext></math>
</para>
<para>Repeated occurrences of the same variable in a binding operator
  are allowed. An &OM; application should treat a binding with
  multiple occurrences of the same variable as equivalent to the
  binding in which all but the last occurrence of each variable is
  replaced by a new variable which does not occur free in the body of
  the binding.  <math display="block"><mi
  mathvariant="bold">binding</mi> <mo>(</mo><mi>lambda</mi><mo>,</mo>
  <mi>v</mi> <mo>,</mo> <mi>v</mi> <mo>,</mo><mi
  mathvariant="bold">application</mi>
  <mo>(</mo><mi>times</mi><mo>,</mo><mi>v</mi>
  <mo>,</mo><mi>v</mi><mo>)</mo> <mo>)</mo></math> is semantically
  equivalent to: <math display="block"><mi
  mathvariant="bold">binding</mi> <mo>(</mo><mi>lambda</mi> <mo>,</mo>
  <msup><mi>v</mi><mo>'</mo></msup> <mo>,</mo> <mi>v</mi>
  <mo>,</mo><mi mathvariant="bold">application</mi>
  <mo>(</mo><mi>times</mi><mo>,</mo><mi>v</mi>
  <mo>,</mo><mi>v</mi><mo>)</mo> <mo>)</mo></math> so that the
  resulting function is actually a constant in its first argument
  (<math><msup><mi>v</mi><mo>'</mo></msup></math> does not occur free
  in the body <math><mi mathvariant="bold">application</mi>
  <mo>(</mo><mi>times</mi><mo>,</mo><mi>v</mi>
  <mo>,</mo><mi>v</mi><mo>)</mo> <mo>)</mo></math>).</para>

  
</listitem>
</varlistentry>
<varlistentry><term>Attribution</term><listitem><para>decorates an
  object with a sequence of one or more pairs made up of an &OM;
  symbol, the <quote>attribute</quote>, and an associated <phrase
  revisionflag="deleted">&OM;</phrase> object, the <quote>value of the
  attribute</quote>.  The value of the attribute can be an <phrase
  revisionflag="added">&OM;</phrase> attribution object itself. As an
  example of this, consider the &OM; objects representing groups,
  automorphism groups, and group dimensions. It is then possible to
  attribute an &OM; object representing a group by its automorphism
  group, itself attributed by its dimension.</para>

<para revisionflag="added">
&OM; objects can be attributed with &OM; derived objects, which are
containers for non-&OM; structures.  For example a mathematical
expression could be attributed with its spoken or visual rendering.
</para>

<para>Composition of attributions, as in
  <math display="block">
<mi mathvariant="bold">attribution</mi><mo>(</mo><mi
  mathvariant="bold">attribution</mi><mo>(</mo><mi>A</mi><mo>,</mo>
  <msub><mi>S</mi><mn>1</mn></msub> <mspace width=".3em"/>
  <msub><mi>A</mi><mn>1</mn></msub><mo>,</mo><mi>&#8230;</mi><mo>,</mo><msub><mi>S</mi><mi>h</mi></msub>
  <mspace width=".3em"/>
  <msub><mi>A</mi><mi>h</mi></msub><mo>)</mo><mo>,</mo>
  <msub><mi>S</mi><mrow><mi>h</mi><mo>+</mo><mn>1</mn></mrow></msub>
  <mspace width=".3em"/>
  <msub><mi>A</mi><mrow><mi>h</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>,</mo>
  <mi>&#8230;</mi><mo>,</mo> <msub><mi>S</mi><mi>n</mi></msub> <mspace
  width=".3em"/> <msub><mi>A</mi><mi>n</mi></msub><mo>)</mo></math> is
  semantically equivalent to a single attribution, that is <math
  display="block"><mi
  mathvariant="bold">attribution</mi><mo>(</mo><mi>A</mi><mo>,</mo>
  <msub><mi>S</mi><mn>1</mn></msub> <mspace width=".3em"/>
  <msub><mi>A</mi><mn>1</mn></msub><mo>,</mo>
  <mi>&#8230;</mi><mo>,</mo> <msub><mi>S</mi><mi>h</mi></msub> <mspace
  width=".3em"/> <msub><mi>A</mi><mi>h</mi></msub><mo>,</mo>
  <msub><mi>S</mi><mrow><mi>h</mi><mo>+</mo><mn>1</mn></mrow></msub>
  <mspace width=".3em"/>
  <msub><mi>A</mi><mrow><mi>h</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>,</mo>
  <mi>&#8230;</mi><mo>,</mo> <msub><mi>S</mi><mi>n</mi></msub> <mspace
  width=".3em"/>
  <msub><mi>A</mi><mi>n</mi></msub><mo>)</mo><mtext>.</mtext></math>
  The operation that produces an object with a single layer of
  attribution is called <emphasis>flattening</emphasis>.</para>

<para>Multiple attributes with the same name are allowed.  While the
  order of the given attributes does not imply any notion of priority,
  potentially it could be significant. For instance, consider the case
  in which <math><msub><mi>S</mi><mi>h</mi></msub> <mo>=</mo>
  <msub><mi>S</mi><mi>n</mi></msub></math> (<math><mi>h</mi>
  <mo>&lt;</mo> <mi>n</mi></math>) in the example above. Then, the
  object is to be interpreted as if the value
  <math><msub><mi>A</mi><mi>n</mi></msub></math> overwrites the value
  <math><msub><mi>A</mi><mi>h</mi></msub></math>.  (&OM; however does
  not mandate that an application preserves the attributes or their
  order.)</para>

<para revisionflag="added">Attribution acts as either adornment
  annotation or as semantical annotation. When the key has rôle
  <emphasis> attribution</emphasis>, then replacement of the
  attributed object by the object itself is not harmful and preserves
  the semantics. When the key has rôle
  <emphasis>semantic-attribution</emphasis> then the attributed
  object is modified by the attribution and cannot be viewed as
  semantically equivalent to the stripped object. If the attribute
  lacks the rôle specification then attribution is acting as adornment
  annotation.
  </para>

<sidebar revision="1999/08/24" author="OC">
<para>Removed reference to syntactic class of an attributed variable</para>
</sidebar>
<para>Objects can be decorated in a multitude of
ways. In&#160;<citation>OM_D131b</citation>, typing of &OM; objects is
expressed by using an attribution. The object <math><mi
mathvariant="bold">attribution</mi><mo>(</mo><mi>A</mi><mo>,</mo>
<mi>type</mi> <mspace width=".3em"/> <mi>t</mi> <mo>)</mo></math>
represents the judgment stating that object <math><mi>A</mi></math>
has type <math><mi>t</mi></math>. Note that both
<math><mi>A</mi></math> and <math><mi>t</mi></math> are &OM;
objects.</para>


<para revisionflag="deleted">Attribution can act as either annotation,
  in the sense of adornment, or as modifier. In the former case,
  replacement of the adorned object by the object itself is probably
  not harmful (preserves the semantics). In the latter case however,
  it may very well be.  Therefore, attribution in general should by
  default be treated as a construct rather than as adornment. Only
  when the CD definitions of the attributes make it clear that they
  are adornments, can the attributed object be viewed as semantically
  equivalent to the stripped object.</para>

  	    
  
  
</listitem>
</varlistentry>
<varlistentry><term>Error</term><listitem><para>is made up of an &OM;
  symbol and a sequence of zero or more &OM; objects. This object has
  no direct mathematical meaning.  Errors occur as the result of some
  treatment on an &OM; object and are thus of real interest only when
  some sort of communication is taking place. Errors may occur inside
  other objects and also inside other errors.  Error objects might
  consist only of a symbol as in the object: <math><mi
  mathvariant="bold">error</mi> <mo>(</mo><mi>S</mi>
  <mo>)</mo></math>.</para> <sidebar revision="1999/09/22"
  author="DPC"><para>Remove classification of suggested error types,
  does not fit current CD scheme</para></sidebar>
</listitem>
</varlistentry>
</variablelist> 
</section>

<section id="sec_names" revisionflag="added">
<title>Names</title>
<para>

The names of symbols, variables and content dictionaries must conform to the
following rules, which are designed to be compatible with standards such as
Unicode and XML.  These standards group individual characters into letters,
digits, combining characters and extenders.  Informally, these are defined as
follows:

<variablelist>

<varlistentry><term>Letters</term><listitem><para> are elements of an
alphabet such as latin, cyrillic, kanji etc.</para></listitem></varlistentry>

<varlistentry><term>Digits</term><listitem><para> are atomic numbers,
from which compound numbers can be constructed (for example `1' is a
digit but `11' is not).</para></listitem></varlistentry>

<varlistentry><term>Combining Characters</term><listitem><para> are
used to combine several characters to produce a new one, for example
an accented character.
</para></listitem></varlistentry>

<varlistentry><term>Extenders</term><listitem><para> are characters
which are neither letters nor combining characters but modify the
appearance of other characters in some way.
</para></listitem></varlistentry>

</variablelist>
Formally, we use the precise definitions given in the Unicode
standard&#160;<citation>UNICODE</citation>.
</para>

<para>

Then a legal &OM; name is defined by the following grammar:
<blockquote>
<informaltable>
<tgroup cols="3">
<tbody>
<row>
<entry>Name </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> (Letter | '_') (Char)*
</entry>
</row>
<row>
<entry>Char</entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</blockquote>

</para>

<formalpara><title>CD Base</title>

A cdbase must conform to the grammar for URIs described in
<citation>IETF2396</citation>.  Note that if non-ASCII characters are
used in a CD or symbol name then when a URI for that symbol is
constructed it will be necessary to map the non-ASCII characters to a
sequence of octets.  The precise mechanism for doing this depends on
the URI scheme.</formalpara>

<formalpara><title>Note on content dictionary names</title>

It is a common convention to store a Content Dictionary in a file of
the same name, which can cause difficulties on many file systems.  If
this convention is to be followed then &OM;
<emphasis>recommends</emphasis> that the name be restricted to the
subset of the above grammar which is a legal POSIX
<citation>POSIX</citation> filename, namely:
<blockquote>
<informaltable>
<tgroup cols="3">
<tbody>
<row>
<entry>Name </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> (PosixLetter | '_') (Char)*
</entry>
</row>
<row>
<entry>Char</entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> PosixLetter | Digit | '.' | '-' | '_' 
</entry>
</row>
<row>
<entry>PosixLetter</entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> 
'a' | 'b' | ... | 'z' | 'A' | 'B' | ... | 'Z'
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</blockquote>

</formalpara>

</section>

<section id="sec_summary">
<title>Summary</title>

<itemizedlist>
<listitem> <para>&OM; supports basic objects like integers, symbols,
  floating-point numbers, character strings, bytearrays, and
  variables.</para>
</listitem>
<listitem> <para>&OM; compound objects are of four kinds:
  applications, bindings, errors, and attributions.</para>
</listitem>
<listitem revisionflag="added"> <para>&OM; objects may be attributed
with non-&OM; objects via the use of derived &OM; objects.
  </para>
</listitem>
<listitem> <para>&OM; objects have the expressive power to cover all
  areas of computational mathematics.</para>
</listitem>
</itemizedlist>

<sidebar revision="1999/09/22" author="DPC"><para>Paragraph moved from
previous section</para></sidebar> <para>Observe that an &OM;
application object is viewed as a <quote>tree</quote> by software
applications that do not understand Content Dictionaries, whereas a
Phrasebook that understands the semantics of the symbols, as defined
in the Content Dictionaries, should interpret the object as functional
application, constructor, or binding accordingly. Thus, for example,
for some applications, the &OM; object corresponding to
<math><mn>2</mn><mo>+</mo><mn>5</mn></math> may result in a command
that writes <math><mn>7</mn></math>.</para>
</section>
</chapter>

<chapter id="cha_enco">
<title>&OM; Encodings</title>


<para>In this chapter, two encodings are defined that map between &OM;
objects and byte streams.  These byte streams constitute a low level
representation that can be easily exchanged between processes (via
almost any communication method) or stored and retrieved from
files.</para>


<para revisionflag="deleted">The first encoding uses ISO 646:1983
characters&#160;<citation>iso646_83</citation> (also known as
<acronym>ascii</acronym> characters) and is an &exml;
application. Although the &exml; markup of the encoding uses only
<acronym>ascii</acronym> characters, &OM; strings may use arbitrary
Unicode/ISO 10646:1988 characters&#160;<citation>UNICODE</citation>.
It can be used, for example, to send &OM; objects via e-mail, news,
cut-and-paste, etc. The texts produced by this encoding can be part of
&exml; documents.</para>

<para revisionflag="added">The first encoding is a character-based
encoding in &exml; format.  In previous versions of the &OM; Standard
this encoding was a restricted subset of the full legal &exml; syntax.
In this version, however, we have removed all these restrictions so that
the earlier encoding is a strict subset of the existing one.  The
&exml; encoding can be used, for example, to send &OM; objects via
e-mail, cut-and-paste, etc. and to embed &OM; objects in &exml;
documents or to have &OM; objects processed by &exml;-aware
applications.</para>

<para>The second encoding is a binary encoding that is meant to be
used when the compactness of the encoding is important (interprocess
communications over a network is an example).</para>

<para>Note that these two encodings are sufficiently different for
autodetection to be effective: an application reading the bytes can
very easily determine which encoding is used.</para>

<section id="sec_xml">
<title>The &exml; Encoding</title>

<para>This encoding has been designed with two main goals in mind:
<orderedlist>
<listitem><para>to provide an encoding that uses common character sets
  (so that it can be easily included in most documents and transport
  protocols) and that is both readable and writable by a human.</para>
</listitem>
<listitem><para>to provide an encoding that can be included (embedded) in
  &exml; documents or processed by &exml;-aware applications.</para>
</listitem>
</orderedlist> 
</para>

<section id="ssec_xml">
<title>A <phrase
revisionflag="deleted">Grammar</phrase><phrase>Schema</phrase> for the &exml; Encoding</title>


<sidebar revision="1999/09/09" author="DPC"><para>Modify description
    of &exml; encoding to make <acronym>dtd</acronym> normative, and
    other changes to increase portability to &exml;
    applications.</para></sidebar>

<para revisionflag="added">The &exml; encoding of an &OM; object is
defined by the Relax NG schema <citation>RELAX</citation> given below.
Relax NG has a number of advantages over the older XSD Schema format
<citation>XSD</citation>, in particular it allows for tighter control
of attributes and has a modular, extensible structure.  Although we
have made the &exml; form, which is given  in <xref
linkend="app_openmath.rng"/> normative, it is generated from the
using the compact syntax given below.
It is also very easy to restrict the schema to allow a limited set of
&OM; symbols as described in <xref linkend="app_relaxrestricted"/>.
</para>

<para revisionflag="added"> Standard tools exist for generating a DTD
or an XSD schema from a Relax NG Schema.  Examples of such documents
are given in <xref linkend="app_dtd"/> and <xref linkend="app_xsd"/>
respectively.</para>

<literallayout revisionflag="added">
&omrnc;
</literallayout>
<para><phrase revisionflag="deleted">the &exml; encoding of an
&OM; object is defined by the dtd given in Figure 4.1 below with the
following additional rules not implied by the &exml;
<acronym>dtd</acronym>.</phrase></para>

<itemizedlist revisionflag="deleted">
<listitem><para revisionflag="deleted" >Comments are permitted only between
elements, not within element character data.</para>
</listitem>

<listitem><para revisionflag="deleted">Processing Instructions are
 only allowed before the <acronym>OMOBJ</acronym> element.</para>
</listitem>

<listitem><para revisionflag="deleted">The content of an
<acronym>OMB</acronym> element, is a valid base64-encoded text.</para>
</listitem>

<listitem><para revisionflag="deleted">The character data forming
element content and attribute values matches the regular expressions
of <xref linkend="fig_xml"/>.</para>
</listitem>
</itemizedlist>



<para id="fig_objdtd" revisionflag="deleted">
    <phrase>DTD for the &OM; &exml; encoding of objects.</phrase>
<literallayout revisionflag="deleted"><![CDATA[
<!-- DTD for OM Objects - sb 29.10.98 -->
<!-- sb 3.2.99 -->

<!--
     general list of embeddable elements
      : excludes OMATP as this is only embeddable in OMATTR
      : excludes OMBVAR as this is only embeddable in OMBIND
-->

<!ENTITY % omel "OMS | OMV | OMI | OMB | OMSTR
                                | OMF | OMA | OMBIND | OME
                                | OMATTR | ]]><![CDATA[">


<!-- things which can be variables -->

<!ENTITY % omvar "OMV | OMATTR" >

]]><![CDATA[

<!-- symbol -->
<!ELEMENT OMS EMPTY>

  <!ATTLIST OMS ]]><![CDATA[
              name CDATA #REQUIRED
              cd CDATA #REQUIRED >

<!-- variable -->
<!ELEMENT OMV EMPTY>
<!ATTLIST OMV  ]]><![CDATA[
              name CDATA #REQUIRED >

<!-- integer -->
<!ELEMENT OMI (#PCDATA) >
]]><![CDATA[

<!-- byte array -->
<!ELEMENT OMB (#PCDATA) >
]]><![CDATA[

<!-- string -->
<!ELEMENT OMSTR (#PCDATA) >
]]><![CDATA[

<!-- floating point -->
<!ELEMENT OMF EMPTY>
<!ATTLIST OMF  ]]><![CDATA[
              dec CDATA #IMPLIED
               hex CDATA #IMPLIED>

<!-- apply constructor -->
<!ELEMENT OMA (%omel;)+ >
]]><![CDATA[


<!-- binding constructor & bound variables -->
<!ELEMENT OMBIND ((%omel;), OMBVAR, (%omel;)) >
]]><![CDATA[

<!ELEMENT OMBVAR (%omvar;)+ >
]]><![CDATA[

<!-- error -->
<!ELEMENT OME (OMS, (%omel;)* ) >
]]><![CDATA[

<!-- attribution constructor & attribute pair constructor -->
<!ELEMENT OMATTR (OMATP, (%omel;)) >
]]><![CDATA[

<!ELEMENT OMATP (OMS, (%omel;))+ >
]]><![CDATA[

]]><![CDATA[

<!-- OM object constructor -->
<!ELEMENT OMOBJ (%omel;) >
<!ATTLIST OMOBJ ]]><![CDATA[
	        xlmns:xlink CDATA #FIXED 'http://www.w3.org/1999/xlink'>]]>
</literallayout>
</para>


<para revisionflag="deleted">In addition, if the &exml; document
encoding the &OM; object is linearised into the &exml; concrete
syntax, the following further constraints apply, which ensure thet the
encoding may be read by &OM; applications that may not include a full
&exml; parser.</para> 

<sidebar revisionflag="deleted" revision="1999/09/09"
author="DPC"><para>Restrictions on not using foo='xxxx'
dropped</para></sidebar>


<itemizedlist revisionflag="deleted" >
<listitem>
<para revisionflag="deleted">The document should use <acronym>utf-8</acronym> encoding.</para>

</listitem>
<listitem>
<para revisionflag="deleted">A <systemitem>&lt;!DOCTYPE</systemitem> declaration should not be used.</para>

</listitem>

<listitem>
<para  revisionflag="deleted">Character references should not be used. As
<systemitem>&lt;!DOCTYPE</systemitem> is not used, the only entity
references that are allowed are the five predefined entity references:
<systemitem>&amp;apos;</systemitem> (&apos;),
<systemitem>&amp;quot;</systemitem> (&quot;),
<systemitem>&amp;lt;</systemitem> (&lt;),
<systemitem>&amp;gt;</systemitem> (&gt;),
<systemitem>&amp;amp;</systemitem> (&amp;).
</para>
</listitem>

<listitem>
<sidebar revisionflag="deleted" revision="1999/09/21"
author="DPC"><para>Restrict empty element
syntax</para></sidebar> 

<para  revisionflag="deleted">The &exml; empty element form
<systemitem>&lt;|<phrase>&#8230;</phrase>/&gt;</systemitem> should
always be used to encode elements such as <acronym>omf</acronym> which
are specified in the <acronym>dtd</acronym> as being
<acronym>empty</acronym>. It should never be used for elements that
may sometimes be empty, such as <acronym>omstr</acronym>.</para>

</listitem>
</itemizedlist>

<para revisionflag="deleted">Such a linearisation of an &exml; encoded &OM; Object would
match the match the character based grammar given in <xref
linkend="fig_xml"/>.</para>

<para revisionflag="deleted">The notation used in this section and in
<xref linkend="fig_xml"/> should be quite straightforward (+ meaning
<quote>one or more</quote>, ? meaning zero or one, and | meaning
<quote>or</quote>).  The start symbol of the grammar is
<quote>start</quote>, <quote>space</quote> stands for the space
character, <quote>cr</quote> for the carriage return character,
<quote>nl</quote> for the line feed character and <quote>tab</quote>
for the horizontal tabulation character.</para>


<para revisionflag="deleted">
    <phrase revisionflag="deleted">Grammar for the &exml; encoding of &OM; objects.</phrase>

<sidebar revision="1999/07/16" author="DPC"><para>White space allowed in integer strings</para></sidebar>

<informaltable revisionflag="deleted">
<tgroup cols="3">
<tbody>
<row>
<entry>S           </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> (space | tab | cr | nl)+  
</entry>
</row>

<row>
<entry>integer     </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> 
        (<systemitem>-</systemitem> S?)? [&digits;]+ (S [&digits;]+)*  |
        (<systemitem>-</systemitem> S?)? <systemitem>x</systemitem> S? [&exadigits;]+ (S [&exadigits;]+)* 
</entry>
</row>
<row>
<entry> 

cdname      </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry>  [&lcalpha;][&lcalpha;&digits;<systemitem>_</systemitem>]*
</entry>
</row>

<row>
<entry>symbname    </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> [&ucalpha;&lcalpha;][&ucalpha;&lcalpha;&digits;<systemitem>_</systemitem>]*
</entry>
</row>

<row>
<entry>fpdec       </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry>  
    (<systemitem>-</systemitem>?)([&digits;]+)?(<systemitem>.</systemitem>[&digits;]+)?(<systemitem>e</systemitem>(&sign;?)[&digits;]+)?
</entry>
</row>

<row>
<entry>fphex       </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry>  [&digits;ABCDEF]+ 
</entry>
</row>

<row>
<entry>varname        </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> ([&ucalpha;&lcalpha;&digits;&varnamechar;])+ 
</entry>
</row>

<row>
<entry>base64      </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> ([&ucalpha;&lcalpha;&digits; +/=] | S)+ 
</entry>
</row>

<row>
<entry>char  </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> <emphasis>&exml; Character Data</emphasis>
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
<sidebar revision="1999/09/09" author="DPC"><para>removed ' from varname</para></sidebar>



<informaltable revisionflag="deleted">
<tgroup cols="3">
<tbody>
<row>
<entry>symbnameatt</entry>
<entry> <math>&longrightarrow;</math></entry>
<entry> 
    <systemitem>name</systemitem> S? = S? (<systemitem>"</systemitem> symbname <systemitem>"</systemitem> <systemitem>|</systemitem> <systemitem>'</systemitem> symbname <systemitem>'</systemitem>) 
</entry>
</row>

<row>
<entry>cdnameatt</entry>
<entry> <math>&longrightarrow;</math></entry>
<entry> <systemitem>cd</systemitem> S? = S? (<systemitem>"</systemitem> cdname <systemitem>"</systemitem> <systemitem>|</systemitem> <systemitem>'</systemitem> cdname <systemitem>'</systemitem>) 
</entry>
</row>

<row>
<entry>varnameatt</entry>
<entry> <math>&longrightarrow;</math></entry>
<entry> <systemitem>name</systemitem> S? = S? (<systemitem>"</systemitem> varname <systemitem>"</systemitem> <systemitem>|</systemitem> <systemitem>'</systemitem> varname <systemitem>'</systemitem>) 
</entry>
</row>

<row>
<entry>fpdecatt</entry>
<entry> <math>&longrightarrow;</math></entry>
<entry> <systemitem>dec</systemitem> S? = S? (<systemitem>"</systemitem> fpdec <systemitem>"</systemitem> <systemitem>|</systemitem> <systemitem>'</systemitem> fpdec <systemitem>'</systemitem>) 
</entry>
</row>

<row>
 <entry>fphexatt</entry>
 <entry> <math>&longrightarrow;</math></entry>
 <entry><systemitem>hex</systemitem> S? = S? (<systemitem>"</systemitem> fphex <systemitem>"</systemitem> <systemitem>|</systemitem> <systemitem>'</systemitem> fphex <systemitem>'</systemitem>) 
</entry>
</row>


<row>
<entry>PI </entry>
<entry> <math>&longrightarrow;</math></entry>
<entry> &lt;<systemitem>?</systemitem> char <systemitem>?</systemitem><systemitem>&gt;</systemitem></entry>
</row>

<row>
<entry>comment</entry>
<entry> <math>&longrightarrow;</math></entry>
<entry> &lt;<systemitem>!-&zsp;-</systemitem> char <systemitem>-&zsp;-</systemitem><systemitem>&gt;</systemitem>
</entry>
</row>

<row>
<entry>SC</entry>
<entry><math>&longrightarrow;</math></entry>
<entry> S+ <systemitem>|</systemitem> (comment S)+
</entry>
</row>

<row>
<entry>start  </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> 
 (SC <systemitem>|</systemitem> PI)* <systemitem>&lt;OMOBJ</systemitem> S?<systemitem>&gt;</systemitem> S? object S? <systemitem>&lt;/OMOBJ</systemitem> S?<systemitem>&gt;</systemitem> 
</entry>
</row>

<row>
<entry>symbol</entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> 
  <systemitem>&lt;OMS</systemitem> [[(S  symbnameatt) (S cdnameatt) ]] S? <systemitem>/&gt;</systemitem>
</entry>
</row>


<row>
<entry>variable</entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry><systemitem>&lt;OMV</systemitem>  varnameatt S? <systemitem>/&gt;</systemitem>
</entry>
</row>

<row><entry/>
<entry>|</entry>
<entry> <systemitem>&lt;OMATTRx</systemitem> S?<systemitem>&gt;</systemitem> SC? omatp SC? variable SC? <systemitem>&lt;/OMATTR</systemitem> S?<systemitem>&gt;</systemitem>
</entry>
</row>

<row>
<entry>omatp </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry>     <systemitem>&lt;OMATP</systemitem>  S?<systemitem>&gt;</systemitem> SC? attrs SC? <systemitem>&lt;/#1</systemitem> S?<systemitem>&gt;</systemitem> 
</entry>
</row>

<row>
<entry>object </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> symbol</entry>
</row>

<row>
<entry/>
<entry>|</entry><entry>variable</entry>
</row>

<row><entry/>
<entry>|</entry>
<entry><systemitem>&lt;OMI</systemitem> S <systemitem>&gt;</systemitem> S? integer S? <systemitem>&lt;/OMI</systemitem> S?<systemitem>&gt;</systemitem>
</entry>
</row>

<row><entry/>
<entry>|</entry><entry> <systemitem>&lt;OMF</systemitem> S fpdecatt  S?<systemitem>/&gt;</systemitem>
</entry>
</row>

<row>
  <entry/>
  <entry>|</entry><entry> <systemitem>&lt;OMF</systemitem> S fphexatt  S?<systemitem>/&gt;</systemitem>
</entry>
</row>

<row>
  <entry/>  
  <entry>|</entry><entry> <systemitem>&lt;OMSTR</systemitem>  S?<systemitem>&gt;</systemitem> char <systemitem>&lt;/OMSTR</systemitem> S?<systemitem>&gt;</systemitem> 
</entry>
</row>

<row>
  <entry/>  
  <entry>|</entry><entry> <systemitem>&lt;OMB</systemitem>  S?<systemitem>&gt;</systemitem> base64  <systemitem>&lt;/OMB</systemitem> S?<systemitem>&gt;</systemitem> 
</entry>
</row>

<row>
  <entry/>
<entry>|</entry>
<entry> <systemitem>&lt;OMA</systemitem>  S?<systemitem>&gt;</systemitem> SC? object SC? objects SC? <systemitem>&lt;/OMA</systemitem> S?<systemitem>&gt;</systemitem>
</entry>
</row>

<row><entry/>
<entry>|</entry><entry> <systemitem>&lt;OMBIND</systemitem>  S?<systemitem>&gt;</systemitem> SC? object SC? 
</entry>
</row>

<row><entry/>
<entry></entry>
<entry> <systemitem>&lt;OMBVAR</systemitem>  S?<systemitem>&gt;</systemitem> SC? variables SC? <systemitem>&lt;/OMBVAR</systemitem> S?<systemitem>&gt;</systemitem> 
</entry>
</row>

<row><entry/>
<entry></entry>
<entry> SC? object SC? <systemitem>&lt;/OMBIND</systemitem> S?<systemitem>&gt;</systemitem>
</entry>
</row>

<row>
  <entry/>
<entry>|</entry>
<entry> <systemitem>&lt;OME</systemitem>  S?<systemitem>&gt;</systemitem> SC? symbol SC? objects SC? <systemitem>&lt;/OME</systemitem> S?<systemitem>&gt;</systemitem> 
</entry>
</row>

<row>
  <entry/>
<entry>|</entry>
<entry> <systemitem>&lt;OMATTR</systemitem>  S?<systemitem>&gt;</systemitem> SC?  <systemitem>&lt;OMATP</systemitem> S?<systemitem>&gt;</systemitem> SC? attrs SC? <systemitem>&lt;/OMBVAR</systemitem> S?<systemitem>&gt;</systemitem>   
</entry>
</row>

<row><entry/>
<entry></entry>
<entry>SC? object SC? <systemitem>&lt;/OMATTR</systemitem> S?<systemitem>&gt;</systemitem>  
</entry>
</row>

<row>
<entry>attrs</entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> symbol S? object   
</entry>
</row>

<row>
  <entry/>
<entry>|</entry>
<entry> symbol S? object S? attrs 
</entry>
</row>

<row>
<entry>objects </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> SC?     
</entry>
</row>

<row>
  <entry/>
<entry>|</entry>
<entry> object SC? objects  
</entry>
</row>

<row>
<entry>variables </entry>
<entry> <math>&longrightarrow;</math> </entry>
<entry> SC?   
</entry>
</row>

<row>
  <entry/>
<entry>|</entry>
<entry> variable SC? variables  
</entry>
</row>

</tbody>
</tgroup>
</informaltable>


</para>
</section>

<section id="sec_xml-desc">
<title><phrase revisionflag="added">Informal</phrase> description of
the <phrase revisionflag="deleted">Grammar</phrase><phrase
revisionflag="added">&exml; Encoding</phrase></title>

<para>An encoded &OM; object is placed inside an <systemitem>OMOBJ</systemitem> element.  This 
element can contain the elements (and integers) described above.
<phrase revisionflag="added"> It can take an optional
<systemitem>version</systemitem> &exml;-attribute which indicates to which
version of the &OM; standard it conforms.  This would allow an older
&OM; application which, for example, could not parse the full &exml;
syntax, to accept objects with version "1" or "1.1" but reject objects
with version "2".
</phrase></para>

<para>We briefly discuss the &exml; encoding for each type of &OM; object
starting from the basic objects.</para>

<variablelist>
<varlistentry><term>Integers</term>
<listitem>
<sidebar revision="1999/09/22" author="DPC"><para>White space allowed
in integer strings</para></sidebar> <para>are encoded using the
<systemitem>OMI</systemitem> element around the sequence of their
digits in base 10 or 16 (most significant digit first).  White space
may be inserted between the characters of the integer representation,
this will be ignored.  After ignoring white space, integers written in
base 10 match the regular expression
<systemitem>-?[0-9]+</systemitem>.  Integers written in base 16 match
<systemitem>-?x[0-9A-F]+</systemitem>.  The integer 10 can be thus
encoded as <systemitem>&lt;OMI> 10 &lt;/OMI> </systemitem> or as
<systemitem>&lt;OMI> xA &lt;/OMI> </systemitem> but neither
<systemitem>&lt;OMI> +10 &lt;/OMI></systemitem> nor
<systemitem>&lt;OMI> +xA &lt;/OMI></systemitem> can be used.</para>

<para>The negative integer <math><mn>-120</mn></math> can be encoded
       as either as decimal <systemitem>&lt;OMI> -120
       &lt;/OMI></systemitem> or as hexadecimal <systemitem>&lt;OMI>
       -x78 &lt;/OMI></systemitem>.</para>

  
</listitem>
</varlistentry>
<varlistentry><term>Symbols</term><listitem><para>are encoded using
  the <systemitem>OMS</systemitem> element. This element has
  <phrase revisionflag="deleted">two</phrase>
  <phrase revisionflag="added">three</phrase>
  &exml;-attributes <systemitem>cd</systemitem>,
  <systemitem>name</systemitem><phrase revisionflag="added">,  and
    <systemitem>cdbase</systemitem></phrase>. The value of
  <systemitem>cd</systemitem> is the name of the Content Dictionary in
  which the symbol is defined and the value of
  <systemitem>name</systemitem> is the name of the symbol.
  <phrase revisionflag="added">The optional <systemitem>cdbase</systemitem>
    attribute is a URI that can be used to disambiguate between two  content
    dictionaries with the same name.</phrase>
<phrase revisionflag="deleted">
  The name
  of the Content Dictionary is compulsory, but a future revision of
  the &OM; standard might introduce a defaulting mechanism.w
</phrase> For
  example:
<blockquote><systemitem>&lt;OMS 
<phrase revisionflag="added">cdbase="http://www.openmath.org/cd"</phrase> cd="transc" name="sin"/></systemitem>
</blockquote>
  is the encoding of the symbol named <systemitem>sin</systemitem> in
  the Content Dictionary named <systemitem>transc</systemitem>,
<phrase revisionflag="added">which is part of the collection
maintained by the &OM; Society</phrase>.</para>

<para revisionflag="added">The three attributes of the
  <systemitem>OMS</systemitem> can be used to build a URI reference for the symbol,
for use in contexts where URI-based referencing mechanisms are used. This
canonical URI reference is constructed as follows:</para>
<blockquote  revisionflag="added">
  <para><systemitem>URI = cdbase-value + '/' + cd-value + '#' + name-value</systemitem></para>
</blockquote>

<para revisionflag="added">For example</para>
<blockquote  revisionflag="added">
  <literallayout><![CDATA[<OMS name="plus" cd="arith1" cdbase="http://www.openmath.org/cd"/>]]></literallayout>
</blockquote>
<para revisionflag="added">
  gives the URI <systemitem>"http://www.openmath.org/cd/arith1#plus"</systemitem>
  This would allow us to refer uniquely to an openmath symbol from a
MathML document <citation>MathML_2000</citation>.</para>
<blockquote  revisionflag="added">
  <literallayout>
&lt;mathml:csymbol xmlns:mathml="http://www.w3.org/1998/Math/MathML/"
                definitionURL="http://www.openmath.org/cd/arith1#plus"&gt;Z&lt;/csymbol&gt;
  </literallayout>
</blockquote>
</listitem>
<para revisionflag="added">
Note that the role attribute described in <xref
linkend="sec_roles"/> is contained in the Content Dictionary and is not
part of the encoding of a symbol.</para>
</varlistentry>
<varlistentry><term>Variables</term><listitem><para>are encoded using
  the <systemitem>OMV</systemitem> element, with only one
  &exml;-attribute, <systemitem>name</systemitem>, whose value is the
  variable name. <phrase revisionflag="deleted">
The variable name is a subset of the printable
  <acronym>ascii</acronym> set of characters.  In particular, neither
  spaces nor double-quote <systemitem>&quot;</systemitem> are allowed
  in variable names.</phrase>  For instance, the encoding of the object
  representing the variable <math><mi>x</mi></math> is:
  <systemitem>&lt;OMV name="x"/></systemitem></para>

<para revisionflag="added">
For an enumerated variable the index or indices of the variable are
encoded as a child.  So for example the encoding
   of the object
  representing the variable
<math><msub><mi>x</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></math> is:
<literallayout><![CDATA[
            <OMV name="x">  
              <OMA>
                <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/> 
                <OMV name="i"/>  
                <OMI>1</OMI>
              </OMA>
            </OMV> 
            ]]></literallayout>
</para>

  
</listitem>
</varlistentry>
<varlistentry><term>Floating-point numbers</term><listitem><para>are
  encoded using the <systemitem>OMF</systemitem> element that has
  either the &exml;-attribute <systemitem>dec</systemitem> or the
  &exml;-attribute <systemitem>hex</systemitem>. The two
  &exml;-attributes cannot be present simultaneously. The value of
  <systemitem>dec</systemitem> is the floating-point number expressed
  in base 10, using the common syntax:</para>
  
  <blockquote><para>
  <systemitem>(-?)([0-9]+)?("."[0-9]+)?(e(-?)[0-9]+)?</systemitem>.
  </para></blockquote>
  
  <para>The value of <systemitem>hex</systemitem> is the digits of the floating-point number
  expressed in base 16, with digits <systemitem>0</systemitem>-<systemitem>9</systemitem>, <systemitem>A</systemitem>-<systemitem>F</systemitem>
  (mantissa, exponent, and sign from lowest to highest bits) using a
  least significant byte ordering.  For example, <systemitem>&lt;OMF
    dec="1.0e-10"/></systemitem> is a valid floating-point number.</para>
  

</listitem>
</varlistentry>
<varlistentry><term>Character strings</term><listitem><para>are encoded using the <systemitem>OMSTR</systemitem> element.
  Its content is  a Unicode text <phrase revisionflag="deleted">(The default encoding 
  is <acronym>utf-8</acronym><citation>utf8</citation>, although &exml; encoded &OM; may be embedded
 in a containing &exml; document that specifies alternative encoding in
  the &exml; declaration</phrase>. Note that as always in &exml; the
  characters <systemitem>&lt;</systemitem> and <systemitem>&amp;</systemitem>  need to be represented by the
  entity references <systemitem>&amp;lt;</systemitem> and
<systemitem>&amp;amp;</systemitem> respectively.</para>
  
</listitem>
</varlistentry>
<varlistentry><term>Bytearrays</term><listitem><para>are encoded using the <systemitem>OMB</systemitem> element. Its content
  is a sequence of characters that is a base64 encoding of the data.
  The base64 encoding is defined in <acronym>rfc</acronym> 1521 <citation>rfc1521</citation>.
  Basically, it represents an arbitrary sequence of octets using 64
  <quote>digits</quote> (<systemitem>A</systemitem> through <systemitem>Z</systemitem>, <systemitem>a</systemitem> through <systemitem>z</systemitem>, <systemitem>0</systemitem> through <systemitem>9</systemitem>, <systemitem>+</systemitem> and /, in order of increasing
  value). Three octets are represented as four digits (the <systemitem>=</systemitem>
  character for padding to the right at the end of the data). All line
  breaks and carriage return, space, form feed and horizontal
  tabulation characters are ignored. The reader is refered to
  <citation>rfc1521</citation> for more detailed information.</para>

</listitem>
</varlistentry>
</variablelist>
 
<para>In detail the encoding of an &OM; object is described below.</para>

<variablelist>
<varlistentry><term>Applications</term><listitem><para>are encoded using the <systemitem>OMA</systemitem> element. The
  application whose root is the &OM; object <math><msub><mi>e</mi><mn>0</mn></msub></math> and whose arguments
  are the &OM; objects <math><msub><mi>e</mi><mn>1</mn></msub></math>, <phrase>&#8230;</phrase>, <math><msub><mi>e</mi><mi>n</mi></msub></math> is encoded as <systemitem>&lt;OMA></systemitem>
  <math><msub><mi>C</mi><mn>0</mn></msub></math> <math><msub><mi>C</mi><mn>1</mn></msub></math><phrase>&#8230;</phrase> <math><msub><mi>C</mi><mi>n</mi></msub></math> <systemitem>&lt;/OMA></systemitem> where <math><msub><mi>C</mi><mi>i</mi></msub></math> is the encoding of
  <math><msub><mi>e</mi><mi>i</mi></msub></math>.</para>

<para>For example, <math><mi mathvariant="bold">application</mi><mo>(</mo><mi>sin</mi><mo>,</mo><mi>x</mi> <mo>)</mo></math> is encoded as:
<literallayout><![CDATA[
            <OMA>  
              <OMS cdbase="http://www.openmath.org/cd" cd="transc1" name="sin"/> 
              <OMV name="x"/>  
            </OMA> 
            ]]></literallayout>
  provided that the symbol <systemitem>sin</systemitem> is defined to be a function
  symbol in a Content Dictionary named <systemitem>transc1</systemitem>.</para>

  
</listitem>
</varlistentry>
<varlistentry><term>Binding</term><listitem><para>is encoded using the <systemitem>OMBIND</systemitem> element.  The binding
  by the &OM; object <math><mi>b</mi></math> of the &OM; variables <math><msub><mi>x</mi><mn>1</mn></msub></math>, <math><msub><mi>x</mi><mn>2</mn></msub></math>,
  <math><mi>&#8230;</mi></math>, <math><msub><mi>x</mi><mi>n</mi></msub></math> in the object <math><mi>c</mi></math> is encoded as <systemitem>&lt;OMBIND></systemitem> <math><mi>B</mi></math>
  <systemitem>&lt;OMBVAR></systemitem> <math><msub><mi>X</mi><mn>1</mn></msub></math> <math><mi>&#8230;</mi></math> <math><msub><mi>X</mi><mi>n</mi></msub></math> <systemitem>&lt;/OMBVAR></systemitem> <math><mi>C</mi></math> <systemitem>&lt;/OMBIND></systemitem> where <math><mi>B</mi></math>, <math><mi>C</mi></math>, and <math><msub><mi>X</mi><mi>i</mi></msub></math> are the encodings of <math><mi>b</mi></math>, <math><mi>c</mi></math>
  and <math><msub><mi>x</mi><mi>i</mi></msub></math>, respectively.</para>

<para>For instance the encoding of
  <math><mi mathvariant="bold">binding</mi>
       <mo>(</mo><mi>lambda</mi><mo>,</mo>
  <mi>x</mi><mo>,</mo><mi mathvariant="bold">application</mi>
     <mo>(</mo><mi>sin</mi><mo>,</mo> <mi>x</mi><mo>)</mo><mo>)</mo></math> is:
<literallayout><![CDATA[ 
      <OMBIND>
        <OMS cdbase="http://www.openmath.org/cd" cd="fns1" name="lambda"/>  
        <OMBVAR>
          <OMV name="x"/>
        </OMBVAR>  
        <OMA>
          <OMS cdbase="http://www.openmath.org/cd" cd="transc1" name="sin"/> 
          <OMV name="x"/>  
        </OMA>
      </OMBIND>]]></literallayout></para>
  
<para>Binders are defined in  Content Dictionaries, in particular,
  the symbol <systemitem>lambda</systemitem> is defined in the Content Dictionary
  <systemitem>fns1</systemitem> for functions over functions.</para>
  
</listitem>
</varlistentry>
<varlistentry><term>Attributions</term><listitem><para>are encoded using the <systemitem>OMATTR</systemitem> element.  If
  the &OM; object <math><mi>e</mi></math> is attributed with (<math><msub><mi>s</mi><mn>1</mn></msub></math>, <math><msub><mi>e</mi><mn>1</mn></msub></math>), <phrase>&#8230;</phrase>, 
  (<math><msub><mi>s</mi><mi>n</mi></msub></math>, <math><msub><mi>e</mi><mi>n</mi></msub></math>) pairs (where <math><msub><mi>s</mi><mi>i</mi></msub></math> are the attributes), it is encoded
  as <systemitem>&lt;OMATTR></systemitem> <systemitem>&lt;OMATP></systemitem> <math><msub><mi>S</mi><mn>1</mn></msub></math> <math><msub><mi>C</mi><mn>1</mn></msub></math> <phrase>&#8230;</phrase> <math><msub><mi>S</mi><mi>n</mi></msub></math> <math><msub><mi>C</mi><mi>n</mi></msub></math> <systemitem>&lt;/OMATP></systemitem> <math><mi>E</mi></math> <systemitem>&lt;/OMATTR></systemitem> where <math><msub><mi>S</mi><mi>i</mi></msub></math> is the encoding of the
  symbol <math><msub><mi>s</mi><mi>i</mi></msub></math>, <math><msub><mi>C</mi><mi>i</mi></msub></math> of the object <math><msub><mi>e</mi><mi>i</mi></msub></math> and <math><mi>E</mi></math> is the encoding of
  <math><mi>e</mi></math>.</para>

<para>Examples are the use of attribution to decorate a group by its
  automorphism group:
<literallayout><![CDATA[
          <OMATTR>    
             <OMATP>
                  <OMS cdbase="http://www.openmath.org/cd" cd="groups" name="automorphism_group" />  
                  [..group-encoding..] 
             </OMATP>  
             [..group-encoding..] 
          </OMATTR>]]></literallayout>
or to express the type of a variable:
<literallayout><![CDATA[ 
          <OMATTR>    
             <OMATP>
                  <OMS cdbase="http://www.openmath.org/cd" cd="ecc" name="type" /> 
                  <OMS cdbase="http://www.openmath.org/cd" cd="ecc" name="real" />
             </OMATP> 
             <OMV name="x" />
           </OMATTR>]]></literallayout></para>

  
</listitem>

<para revisionflag="added">
A special use of attributions is to associate non-&OM; data with an
&OM; object.  This is done using the
<systemitem>OMFOREIGN</systemitem> element.  The children of this
element must be well-formed &exml;.  For example the attribution of the
&OM; object 
  <math>
     <mi>sin</mi><mfenced><mi>x</mi></mfenced></math> with its
representation in Presentation MathML is:
<literallayout><![CDATA[ 
      <OMATTR>
        <OMATP>
          <OMS cd="presentation1" name="mathml"/>  
          <OMFOREIGN>
            <math xmlns="http://www.w3.org/1998/Math/MathML">
              <mi>sin</mi><mfenced><mi>x</mi></mfenced>
            </math>
          </OMFOREIGN>  
        </OMATP>
        <OMA>
          <OMS cdbase="http://www.openmath.org/cd" cd="transc1" name="sin"/> 
          <OMV name="x"/>  
        </OMA>
      </OMATTR>]]></literallayout>
Of course not everything has a natural XML encoding in this way and
often the contents of a <systemitem>OMFOREIGN</systemitem> will just
be data or some kind of encoded string.  For example the attribution
of the previous object with its LaTeX representation could be achieved
as follows:
<literallayout><![CDATA[ 
      <OMATTR>
        <OMATP>
          <OMS cd="presentation1" name="latex"/>  
          <OMFOREIGN>
            sin\,(x)
          </OMFOREIGN>  
        </OMATP>
        <OMA>
          <OMS cdbase="http://www.openmath.org/cd" cd="transc1" name="sin"/> 
          <OMV name="x"/>  
        </OMA>
      </OMATTR>]]></literallayout>
</para>
</varlistentry>

<varlistentry>
 <term>Errors</term> 
 <listitem><para>are encoded using the <systemitem>OME</systemitem> element. The error whose
  symbol is <math><mi>s</mi></math> and whose arguments are the &OM; objects <math><msub><mi>e</mi><mn>1</mn></msub></math>,
  <phrase>&#8230;</phrase>, <math><msub><mi>e</mi><mi>n</mi></msub></math> is encoded as <systemitem>&lt;OME></systemitem> <math><msub><mi>C</mi><mi>s</mi></msub></math> <math><msub><mi>C</mi><mn>1</mn></msub></math><phrase>&#8230;</phrase> <math><msub><mi>C</mi><mi>n</mi></msub></math> <systemitem>&lt;/OME></systemitem> where <math><msub><mi>C</mi><mi>s</mi></msub></math> is the encoding of <math><mi>s</mi></math> and <math><msub><mi>C</mi><mi>i</mi></msub></math> the encoding
  of <math><msub><mi>e</mi><mi>i</mi></msub></math>.</para>

<para>If an <systemitem>aritherror</systemitem> Content Dictionary contained a
  <systemitem>DivisionByZero</systemitem> symbol, then the object
  <math><mi mathvariant="bold">error</mi><mo>(</mo><mi>DivisionByZero</mi><mo>,</mo> <mi mathvariant="bold">application</mi>
  <mo>(</mo><mi>divide</mi><mo>,</mo> 
  <mi>x</mi><mo>,</mo> <mn>0</mn><mo>)</mo><mo>)</mo></math> would be encoded as follows:

<literallayout><![CDATA[ 
            <OME>
            <OMS cdbase="http://www.openmath.org/cd" cd="aritherror" name="DivisionByZero"/>  
            <OMA>
                 <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="divide" />
                 <OMV name="x"/>  
                 <OMI> 0 </OMI>
            </OMA> 
            </OME>]]></literallayout></para>
  
</listitem>
</varlistentry>

<varlistentry revisionflag="added">
 <term>References</term>
 <listitem><para>
 &OM; integers, floating point numbers, character strings,
 byearrays, applications, binding, attributions can also be encoded
 as an empty <systemitem>OMR</systemitem> element with an <systemitem>xlink:href</systemitem>
 attribute whose value is the value of an id attribute of an &OM; object of
 that type. The &OM; element represented by this <systemitem>OMR</systemitem>
 element is a copy of the &OM; element pointed to in the
 <systemitem>xlink:xref</systemitem> attribute. Note that the representation of the
 <systemitem>OMR</systemitem>
 element is <emphasis>structurally equal</emphasis>, but not identical
 to the element it points to. </para>

 <para>For instance, the &OM; object

 <math display="block">
   <mrow>
     <mi mathvariant="bold">application</mi>
     <mrow>
       <mo fence="true">(</mo>
       <mrow>
         <mi>f</mi>
         <mo separator="true">,</mo>
         <mi mathvariant="bold">application</mi>
         <mrow>
           <mo fence="true">(</mo>
           <mrow>
             <mi>f</mi>
             <mo separator="true">,</mo>
             <mi mathvariant="bold">application</mi>
             <mrow>
               <mo fence="true">(</mo>
               <mrow><mi>f</mi><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><mi>a</mi></mrow>
               <mo fence="true">)</mo>
             </mrow>
             <mo separator="true">,</mo>
             <mi mathvariant="bold">application</mi>
             <mrow>
               <mo fence="true">(</mo>
               <mrow><mi>f</mi><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><mi>a</mi></mrow>
               <mo fence="true">)</mo>
             </mrow>
             <mo fence="true">)</mo>
           </mrow>
           <mo separator="true">,</mo>
           <mi mathvariant="bold">application</mi>
           <mrow>
             <mo fence="true">(</mo>
             <mrow>
               <mi>f</mi>
               <mo separator="true">,</mo>
               <mi mathvariant="bold">application</mi>
               <mrow>
                 <mo fence="true">(</mo>
                 <mrow><mi>f</mi><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><mi>a</mi></mrow>
                 <mo fence="true">)</mo>
               </mrow>
               <mo separator="true">,</mo>
               <mi mathvariant="bold">application</mi>
               <mrow>
                 <mo fence="true">(</mo>
                 <mrow><mi>f</mi><mo separator="true">,</mo><mi>a</mi><mo separator="true">,</mo><mi>a</mi></mrow>
                 <mo fence="true">)</mo>
               </mrow>
               <mo fence="true">)</mo>
             </mrow>
           </mrow>
           <mo fence="true">)</mo>
         </mrow>
       </mrow>
     </mrow>
   </mrow>
 </math>
</para>
<para>can be encoded in the &exml; encoding as either one of the &exml; encodings
below (and some intermedidate versions as well).</para>

<figure id="fig_shared_vs_unshared">
    <title>Shared vs. unshared representations</title>
    
 <literallayout><![CDATA[
 <OMOBJ>                                <OMOBJ>
  <OMA>                                   <OMA>
    <OMA>                                    <OMA id="t1">
      <OMV name="f"/>                           <OMV name="f"/>
      <OMA>                                     <OMA id="t11">
        <OMV name="f"/>                            <OMV name="f"/>
        <OMV name="a"/>                            <OMV name="a"/>
        <OMV name="a"/>                            <OMV name="a"/>
      </OMA>                                    </OMA>
      <OMA>                                     <OMR xlink:href="t11"/>
        <OMV name="f"/>
        <OMV name="a"/> 
        <OMV name="a"/>
      </OMA>                                   </OMA>
      <OMA>                                     <OMR xlink:href="t1"/>
        <OMV name="f"/>
        <OMA>
          <OMV name="f"/>
          <OMV name="a"/>
          <OMV name="a"/>
        </OMA>
        <OMA>
          <OMV name="f"/>
          <OMV name="a"/>
          <OMV name="a"/>
        </OMA>
      </OMA>
     </OMA>
   </OMA>
 </OMOBJ>                                 </OMOBJ>]]>
</literallayout>
</figure>

<para>We say that an &OM; element dominates all its children and all elements
they dominate. An <systemitem>OMR</systemitem> element dominates its target,
i.e. the element that carries the <systemitem>id</systemitem> attribute pointed to
by the <systemitem>xref</systemitem> attribute. For instance in the representation
in Figure <xref linkend="fig_shared_vs_unshared"/>, the
<systemitem>OMA</systemitem> element with <systemitem>id="t1"</systemitem> and
also the second <systemitem>OMR</systemitem> dominate the
<systemitem>OMA</systemitem> element with <systemitem>id="t11"</systemitem>.
</para> </listitem> </varlistentry> </variablelist>

<section id="sec_acyclicity" revisionflag="added">
<title>An Acyclicity Constraint</title>

<para revisionflag="added">The occurrences of the <systemitem>OMR</systemitem> element must obey the following global
<emphasis>acyclicity constraint</emphasis>: An &OM; element may not dominate itself.</para>

<para revisionflag="added">Consider for instance the following (illegal) &exml; representation
<literallayout><![CDATA[
<OMOBJ>
  <OMA id="foo">
    <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="divide"/>
    <OMI>1</OMI>
    <OMA>
       <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
       <OMI>1</OMI>
       <OMR xref="foo"/>
    </OMA> 
  </OMA>
</OMOBJ>]]>
</literallayout>
</para>

<para revisionflag="added">Here, the <systemitem>OMA</systemitem> element with
<systemitem>id="foo"</systemitem> dominates its second child, which dominates the
<systemitem>OMR</systemitem> element, which dominates its target: the element with
<systemitem>id="foo"</systemitem>. So by transitivity, this element dominates itself, and
by the acyclicity constraint, it is not the &exml; representation of an &OM;
element. Even though it could be given the interpretation of the continued fraction
<math display="block">
 <mfrac>
   <mn>1</mn>
   <mrow>
     <mn>1</mn>
     <mo>+</mo>
     <mfrac>
       <mn>1</mn>
       <mrow>
	 <mn>1</mn>
	 <mo>+</mo>
	 <mfrac><mn>1</mn><mi>...</mi></mfrac>
       </mrow>
     </mfrac>
   </mrow>
 </mfrac>
</math> this would correspond to an infinite tree of applications,
which is not admitted by the structure of &OM; objects described
in section 3.</para>

<para revisionflag="added">Note that the acyclicity constraints is not restricted to such simple
cases, as the following example shows.</para>

<para><literallayout><![CDATA[
<OMOBJ>                                <OMOBJ>
  <OMA id="bar">                         <OMA id="baz">
    <OMS cd="arith1" name="plus"/>         <OMS cd="arith1" name="plus"/>
    <OMI>1</OMI>                           <OMI>1</OMI>
    <OMR xref="baz"/>                      <OMR xref="bar"/>
  </OMA>                                 </OMA>
</OMOBJ>                               </OMOBJ>]]>
</literallayout></para>

<para revisionflag="added"> Here, the <systemitem>OMA</systemitem> with
<systemitem>id="bar"</systemitem> dominates its second child, the
<systemitem>OMR</systemitem> with <systemitem>xref="baz"</systemitem>,
which dominates its target <systemitem>OMA</systemitem> with
<systemitem>id="baz"</systemitem>, which in turn dominates its second
child, the <systemitem>OMR</systemitem> with
<systemitem>xref="bar"</systemitem>, this finally dominates its
target, the original <systemitem>OMA</systemitem> element with
<systemitem>id="bar"</systemitem>. So this pair of &OM; objects
violates the acyclicity constraint and is not the &exml;
representation of an &OM; object.</para>
</section>


<section id="sec_sharing_bvars" revisionflag="added">
<title>Sharing and Bound Variables</title>

<para>Note that the <systemitem>OMR</systemitem> element is a
<emphasis>syntactic</emphasis> referencing mechanism: an
<systemitem>OMR</systemitem> element stands for the exact &exml;
element it points to. In particular, referencing does not interact
with binding in a semantically intuitive way, since it allows for
variable capture. Consider for instance the following &exml;
representation: <literallayout><![CDATA[
<OMBIND id="outer">
  <OMS cdbase="http://www.openmath.org/cd" cd="fns1" name="lambda"/>
  <OMBVAR><OMV name="X"/></OMBVAR>
  <OMA>
    <OMV name="f"/>
    <OMBIND id="inner">
      <OMS cdbase="http://www.openmath.org/cd" cd="fns1" name="lambda"/>
      <OMBVAR><OMV name="X"/></OMBVAR>
      <OMR id="copy" xlink:href="orig"/>
    </OMBIND>
    <OMA id="orig"><OMV name="g"/><OMV name="X"/></OMA>
  </OMA>
</OMBIND>]]>
</literallayout>
it represents the &OM; object
<math display="block">
  <mi mathvariant="bold">binding</mi>
  <mrow>
    <mo fence="true">(</mo>
    <mo>&#x003BB;</mo>
      <mo separator="true">,</mo>
    <mi>X</mi>
    <mo separator="true">,</mo>
    <mrow>
      <mi mathvariant="bold">application</mi>
      <mo fence="true">(</mo>
      <mi>f</mi>
      <mo separator="true">,</mo>
      <mi mathvariant="bold">binding</mi>
      <mrow>
	<mo fence="true">(</mo>
	<mo>&#x003BB;</mo>
	<mo separator="true">,</mo>
	<mi>X</mi>
	<mo separator="true">,</mo>
	<mrow>
	  <mi mathvariant="bold">application</mi>
	  <mo fence="true">(</mo>
	  <mi>g</mi>
	  <mo separator="true">,</mo>
	  <mi>X</mi>
	  <mo fence="true">)</mo>
	</mrow>
	<mo fence="true">)</mo>
      </mrow>
      <mo separator="true">,</mo>
      <mrow>
	<mi mathvariant="bold">application</mi>
	<mo fence="true">(</mo>
	<mi>g</mi>
	<mo separator="true">,</mo>
	<mi>X</mi>
	<mo fence="true">)</mo>
      </mrow>
      <mo fence="true">)</mo>
    </mrow>
    <mo fence="true">)</mo>
  </mrow>
  <mo fence="true">)</mo> </math> which has two subterms of the form
<math>
  <mi mathvariant="bold">application</mi>
  <mo fence="true">(</mo>
  <mi>g</mi>
  <mo separator="true">,</mo>
  <mi>X</mi>
  <mo fence="true">)
  </mo> </math>, one with <systemitem>id="orig"</systemitem> (the one explicitly
represented) and one with <systemitem>id="copy"</systemitem>, represented by the
<systemitem>OMR</systemitem> element. In the original, the variable
<math><mi>X</mi></math> is bound by the <emphasis>outer</emphasis>
<systemitem>OMBIND</systemitem> element, and in the copy, the variable
<math><mi>X</mi></math> is bound by the <emphasis>inner</emphasis>
<systemitem>OMBIND</systemitem> element. We say that the inner
<systemitem>OMBIND</systemitem> has captured the variable <math><mi>X</mi></math>.
</para>

<para>It is well-known that variable capture does not conserve semantics. For
  instance, we could use <math><mi>&#x003B1;</mi></math>-conversion to rename the inner occurrence of
  <math><mi>x</mi></math> into - say - 
  <math><mi>y</mi></math> arriving at the (same) object
<math display="block">
  <mi mathvariant="bold">binding</mi>
  <mrow>
    <mo fence="true">(</mo>
    <mo>&#x003BB;</mo>
      <mo separator="true">,</mo>
    <mi>X</mi>
    <mo separator="true">,</mo>
    <mrow>
      <mi mathvariant="bold">application</mi>
      <mo fence="true">(</mo>
      <mi>f</mi>
      <mo separator="true">,</mo>
      <mi mathvariant="bold">binding</mi>
      <mrow>
	<mo fence="true">(</mo>
	<mo>&#x003BB;</mo>
	<mo separator="true">,</mo>
	<mi mathcolor="red">Y</mi>
	<mo separator="true">,</mo>
	<mrow>
	  <mi mathvariant="bold">application</mi>
	  <mo fence="true">(</mo>
	  <mi>g</mi>
	  <mo separator="true">,</mo>
	  <mi mathcolor="red">Y</mi>
	  <mo fence="true">)</mo>
	</mrow>
	<mo fence="true">)</mo>
      </mrow>
      <mo separator="true">,</mo>
      <mrow>
	<mi mathvariant="bold">application</mi>
	<mo fence="true">(</mo>
	<mi>g</mi>
	<mo separator="true">,</mo>
	<mi>X</mi>
	<mo fence="true">)</mo>
      </mrow>
      <mo fence="true">)</mo>
    </mrow>
    <mo fence="true">)</mo>
  </mrow>
  <mo fence="true">)</mo> </math>
 Using references that
capture variables in this way can easily lead to representation errors, and is not
  recommended.
</para>
</section>
</section>

<section id="xmldoc">
<title>Embedding &OM; in &exml; Documents</title>

<sidebar revision="1999/09/21" author="DPC"><para>New section on embedding &OM; in &exml; documents</para></sidebar>     
<para>The above encoding of &exml; encoded &OM; specifies the grammar to be
used in files that encode a single &OM; object, and specifies the
character streams that a conforming &OM; application should be able
to accept or produce.</para>

<para>When embedding &exml; encoded &OM; objects into a larger &exml; document
one may wish, or need, to use other &exml; features. For example use of
extra &exml; attributes to specify &exml; Namespaces&#160;<citation>xmlns</citation>
or xml:lang attributes to specify the language used in strings&#160;<citation>xml</citation>.
<phrase revisionflag="deleted">
Also, the encoding used in the larger document may not be
<acronym>utf-8</acronym>.</phrase>
</para>

<sidebar revision="2000/03/20" author="DPC"><para>Namespace URI, as discussed on&OM;Soc
list</para></sidebar> <para revisionflag="deleted">In particular, if &OM; is used with applications that use the
&exml; Namespace Recommendation &#160;<citation>xmlns</citation> then they should ensure
that &OM; elements are in the <phrase revisionflag="added">namespace
</phrase> <phrase role="tt">http://www.openmath.org/OpenMath</phrase>.
This is most conveniently achieved by adding the namespace declaration <literallayout>
xmlns="http://www.openmath.org/OpenMath" </literallayout> as an attribute to each
<systemitem>OMOBJ</systemitem> element in the document.</para>

<!--
<para revisionflag="added">
 Furthermore, for any &OM; object that contains the <systemitem>OMR</systemitem> element,
 we have to add the <systemitem>XLink</systemitem> namespace declaration
  <phrase role="tt">xmlns:xlink="http://www.w3.org/1999/xlink"</phrase>.
</para>
-->

<para>If such &exml; features are used then the &exml; application controlling the
document must, if passing the &OM; fragment to an &OM; application,
remove any such extra attributes and must ensure that the
fragment is encoded according to the grammar specified above.</para>
</section>
</section>

<section id="sec_binary">
<title>The Binary Encoding</title>

<para>The binary encoding was essentially designed to be more compact than
the &exml; encodings, so that it can be more efficient if large
amounts of data are involved. For the current encoding, we tried to
keep the right balance between compactness, speed of encoding and
decoding and simplicity (to allow a simple specification and easy
implementations).</para>

<section id="sec_binary_grammar">
<title>A Grammar for the Binary Encoding</title>

<sidebar revision="1999/06/24" author="DPC"><para>New attrvar production</para></sidebar>     

<figure id="fig_bin-enc">
    <title>Grammar of the binary encoding of &OM; objects.</title>
    
    <informaltable>
      <tgroup cols="6">
	<tbody>
	  <row>
	    <entry>start </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [24] object [25] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [24+64] object [25]</entry>
	  </row>
	  
	  <row>
	    <entry>object </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> integer </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> float</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> variable</entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry> indexed_variable</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> symbol</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> string</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> bytearray</entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry> derived</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> construct</entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry>internal_reference</entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry>external_reference</entry>
	  </row>
	  
	  <row>
	    <entry>integer </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [1] [_] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [1+64]
	      [<math><mi>n</mi></math>]
	      id:<math><mi>n</mi></math>
	      [_]
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [1+128] {_} </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [1+64+128]
	      {<math><mi>n</mi></math>}
	      id:<math><mi>n</mi></math>
	      {_}
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [2]
	      [<math><mi>n</mi></math>]
	      [_] digits:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [2+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      [_] digits:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [2+128]
	      {<math><mi>n</mi></math>}
	      [_] digits:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [2+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>n</mi></math>}
	      [_]
	      digits:<math><mi>n</mi></math>
	      id:<math><mi>n</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry>float </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [3] {_}{_} </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [3+64]
	      [<math><mi>n</mi></math>]
	      id:<math><mi>n</mi></math>
	      {_}{_}</entry>
	  </row>
	  
	  <row>
	    <entry>variable </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [5]
	      [<math><mi>n</mi></math>]
	      varname:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [5+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      varname:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [5+128]
	      {<math><mi>n</mi></math>}
	      varname:<math><mi>n</mi></math>
	    </entry>
	    <entry>|</entry>
	    <entry revisionflag="added"> [5+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      varname:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry>indexed_variable</entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [10]
	      [<math><mi>n</mi></math>]
	      varname:<math><mi>n</mi></math>
	      object [11]
	    </entry>
	    <entry><math>|</math></entry>
	    <entry> [10+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      varname:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	      object [11]
	    </entry>
	  </row>
	  
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry><math>|</math></entry>
	    <entry> [10+128]
	      {<math><mi>n</mi></math>}
	      varname:<math><mi>n</mi></math>
	      object [11]
	    </entry>
	    <entry><math>|</math></entry>
	    <entry> [10+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      varname:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	      object [11]
	    </entry>
	  </row>
	  
	  <row>
	    <entry>symbol</entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [8]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [8+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      [<math><mi>k</mi></math>]
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	      id:<math><mi>k</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [8+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [8+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      {<math><mi>k</mi></math>}
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	      id:<math><mi>k</mi></math></entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry> [9]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      [<math><mi>k</mi></math>]
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	      uri:<math><mi>k</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [9+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      [<math><mi>k</mi></math>]
	      [<math><mi>l</mi></math>]
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	      uri:<math><mi>k</mi></math>
	      id:<math><mi>l</mi></math>
	    </entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry> [9+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      {<math><mi>k</mi></math>}
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	      uri:<math><mi>k</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [9+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      {<math><mi>k</mi></math>}
	      {<math><mi>l</mi></math>}
	      cdname:<math><mi>n</mi></math>
	      symbname:<math><mi>m</mi></math>
	      uri:<math><mi>k</mi></math></entry>
	    id:<math><mi>l</mi></math>
	  </row>
	  
	  <row>
	    <entry>string </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [6]
	      [<math><mi>n</mi></math>]
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [6+64]
	      [<math><mi>n</mi></math>]
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mi>n</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [6+128]
	      {<math><mi>n</mi></math>}
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [6+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [7]
	      [<math><mi>n</mi></math>]
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mn>2</mn><mi>n</mi></math>
	    </entry>
	    <entry  revisionflag="added">|</entry>
	    <entry revisionflag="added"> [7+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mn></mn><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [7+128]
	      {<math><mi>n</mi></math>}
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mn>2</mn><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [7+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      <phrase revisionflag="deleted">chars</phrase>
	      <phrase revisionflag="added">bytes</phrase>:<math><mn>2</mn><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry>bytearray </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [4]
	      [<math><mi>n</mi></math>]
	      bytes:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [4+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      bytes:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [4+128]
	      {<math><mi>n</mi></math>}
	      bytes:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [4+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      bytes:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  
	  <row revisionflag="added">
	    <entry>derived</entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [12]
	      [<math><mi>n</mi></math>]
	      bytes:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [12+64]
	      [<math><mi>n</mi></math>]
	      [<math><mi>m</mi></math>]
	      bytes:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry> [12+128]
	      {<math><mi>n</mi></math>}
	      bytes:<math><mi>n</mi></math>
	    </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [12+64+128]
	      {<math><mi>n</mi></math>}
	      {<math><mi>m</mi></math>}
	      bytes:<math><mi>n</mi></math>
	      id:<math><mi>m</mi></math>
	    </entry>
	  </row>
	  
	  <row>
	    <entry>construct </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [16] object objects [17] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [16+64]
	      {<math><mi>m</mi></math>}
	      id:<math><mi>m</mi></math>
	      object objects [17]
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [22] symbol objects [23] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [22+64]
	      {<math><mi>m</mi></math>}
	      id:<math><mi>m</mi></math>
	      symbol objects [23]</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [18] attrpairs object [19] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [18+64]
	      {<math><mi>m</mi></math>}
	      id:<math><mi>m</mi></math>
	      attrpairs object [19]
	    </entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [26] object bvars object [27] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [26+64]
	      {<math><mi>m</mi></math>}
	      id:<math><mi>m</mi></math>
	      object bvars object [27]
	    </entry>
	  </row>
	  
	  <row>
	    <entry>attrpairs </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [20] pairs [21] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [20+64]
	      {<math><mi>m</mi></math>}
	      id:<math><mi>m</mi></math>
	      pairs [21]
	    </entry>
	  </row>
	  
	  <row>
	    <entry>pairs </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> symbol object</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> symbol object pairs</entry>
	  </row>
	  
	  <row>
	    <entry>bvars </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [28] vars [29] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [28+64]
	      {<math><mi>m</mi></math>}
	      id:<math><mi>m</mi></math>
	      vars [29]
	    </entry>
	  </row>
	  
	  <row>
	    <entry>vars </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> attrvar</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> attrvar vars</entry>
	  </row>
	  
	  <row>
	    <entry>attrvar </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> variable</entry>
	  </row>
	  
	  <row>
	    <entry/>
	    <entry>|</entry>
	    <entry> [18] attrpairs attrvar [19] </entry>
	    <entry revisionflag="added">|</entry>
	    <entry revisionflag="added"> [18+64]
	      {<math><mi>m</mi></math>}
	      id:<math><mi>m</mi></math>
	      attrpairs attrvar [19]
	    </entry>
	  </row>
	  
	  <row>
	    <entry>objects </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> object objects</entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry>internal_reference </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [30] [_] </entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry> [30+128] {_}</entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry>external_reference </entry>
	    <entry><math>&longrightarrow;</math></entry>
	    <entry> [31]
	      [<math><mi>n</mi></math>]
	      uri:<math><mi>n</mi></math>
	    </entry>
	  </row>
	  
	  <row revisionflag="added">
	    <entry/>
	    <entry>|</entry>
	    <entry> [31+128]
	      {<math><mi>n</mi></math>}
	      uri:<math><mi>n</mi></math>
	    </entry>
	  </row>
	</tbody>
      </tgroup>
    </informaltable>
  </figure>
  
  <para>Figure <xref linkend="fig_bin-enc"/> gives a grammar for the binary
    encoding <phrase revisionflag="added"> (<quote>start</quote> is the start
      symbol).</phrase>.</para>
  <para>The following conventions are used in this section:
    [<math><mi>n</mi></math>] denotes a byte whose value is the integer
    <math><mi>n</mi></math> (<math><mi>n</mi></math> can range from 0 to 255),
    {<math><mi>m</mi></math>} denotes four bytes representing the (unsigned) integer
    <math><mi>m</mi></math> in network byte order, [_] denotes an arbitrary byte, {_}
    denotes an arbitrary sequence of four bytes.
    <phrase revisionflag="deleted">
      <emphasis>name</emphasis>:<math><mi>n</mi></math> denotes a sequence of
      <math><mi>n</mi></math> bytes named <emphasis>name</emphasis>.
      <emphasis>name</emphasis>:2<math><mi>n</mi></math> denotes a sequence of
      <math><mn>2</mn><mi>n</mi></math> bytes.  <quote>start</quote> is the start symbol of the
      grammar.</phrase></para>
  
  <para revisionflag="added"><emphasis>xxxx</emphasis>:<math><mi>n</mi></math>,
    where <emphasis>xxxx</emphasis> is one of <emphasis>symbname</emphasis>,
    <emphasis>cdname</emphasis>, <emphasis>varname</emphasis>,
    <emphasis>uri</emphasis>, <emphasis>id</emphasis>, <emphasis>digits</emphasis>, or
    <emphasis>bytes</emphasis> denotes a sequence of <math><mi>n</mi></math> bytes
    that conforms to the constraints on <emphasis>xxxx</emphasis> strings. For
    instance, for <emphasis>symbname</emphasis>, <emphasis>varname</emphasis>, or
    <emphasis>cdname</emphasis>this is the regular expression described in
    <xref linkend="sec_names"/>, for <emphasis>uri</emphasis> it is the grammar for
    URIs in <citation>IETF2396</citation>.</para>
</section>

<section id="sec_bin-desc">
  <title>Description of the Grammar</title>
  
<para>An &OM; object is encoded as a sequence of bytes starting with the begin object tag
(<phrase revisionflag="deleted">value&#160;24</phrase>
<phrase revisionflag="added">values 24 and 88</phrase>) and ending with the end
object tag (<phrase revisionflag="deleted">value&#160;25</phrase>
<phrase revisionflag="added">values 25 and 89</phrase>). These are similar to
the <systemitem>&lt;OMOBJ></systemitem> and <systemitem>&lt;/OMOBJ></systemitem> tags of
the &exml; encoding.</para>

<para>The encoding of each kind of &OM; object begins with a tag that is a single byte,
holding a <phrase role="sl">token identifier</phrase>
<phrase revisionflag="added"> that describes the kind of object</phrase> and two flags, the <phrase
role="sl">long</phrase> flag and the <phrase role="sl">shared</phrase> flag. The
identifier is stored in the first 6 bits (1 to 6). The long flag is the eighth bit
<phrase revisionflag="added">and the shared flag is the seventh bit. If the long
  flag is set, this signifies that  the names, strings, and data fields in the
  encoded &OM; object are longer than 255 byte or characters. The sharing flag
  indicates that the encoded object is shared in another (part of an) object
  somewhere else (see <xref linkend="sec_sharing_references"/>). Note that if the sharing
  flag is set (in the right column of the grammar in Figure
  <xref linkend="fig_bin-enc"/>, then the encoding includes a representation of
  the identifier.</phrase>
</para> 

<para>Here is a description of the binary encodings of every kind of &OM; object:


<variablelist>
<varlistentry>
  <term>Integers</term><listitem><para>are encoded depending on how large they
      are. There are four possible formats.  Integers between -128 and 127 are
      encoded as the small integer (<phrase revisionflag="added">token identifier</phrase> 1) followed by a single byte that is the
      value of the integer (interpreted as a signed character). For
      example 16 is encoded as <systemitem>0x01 0x10</systemitem>.  Integers between
      <math>
	<msup>
	  <mn>-2</mn>
	  <mn>31</mn>
	</msup>
      </math>
      (<math><mn>-2147483648</mn></math>) and
      <math>
	<msup>
	  <mn>2</mn>
	  <mn>31</mn>
	</msup>
	<mo>-</mo>
	<mn>1</mn>
      </math>
      (<math><mn>2147483647</mn></math>) are encoded as
      the small integer tag with the long flag set followed by the integer
      encoded in little endian format on four bytes (network byte order:
      the most significant byte comes first). For example, 128 is encoded
      as <systemitem>0x81</systemitem> <systemitem>0x00000080</systemitem>.  The most
      general encoding begins 
      with the big integer tag (token identifier 2) with the long flag set
      if the number of bytes in the encoding of the digits is greater or
      equal than 256. It is followed by the length (in bytes) of the
      sequence of digits, encoded on one byte (0 to 255, if the long flag
      was not set) or four bytes (network byte order, if the long flag was
      set).  It is then followed by a byte describing the sign and the
      base.  This 'sign/base' byte is <systemitem>+</systemitem> (0x2B) or
      <systemitem>-</systemitem> (0x2D) 
      for the sign ored with the base mask bits that can be 0 for base 10
      or 0x40 for base 16.  It is followed by the strings of digits (as
      characters) in their natural order (as in the &exml;
      encoding).  For example, 8589934592
      (<math><msup><mn>2</mn><mn>33</mn></msup></math>) is encoded <systemitem>0x02 
	0x0A 0x2B 0x38353839393334353932</systemitem> and
      xf&zsp;f&zsp;f&zsp;f&zsp;f&zsp;f&zsp;f1 is 
      encoded as <systemitem>0x02 0x08 0x6b 0x6666666666666631</systemitem>.  Note that it is
      permitted to encode a <quote>small</quote> integer in any <quote>bigger</quote>
      format.
    </para>
</listitem>
</varlistentry>

<varlistentry>
<term>Symbols</term>
<listitem><para>are encoded as the symbol tags
    (<phrase revisionflag="added">token identifier</phrase> 8) with the long flag
    set if the maximum of the length of the Content Dictionary name,
    <phrase revisionflag="deleted">and</phrase>
  the symbol name <phrase revisionflag="added">or the CD base </phrase>
  is greater than or equal to 256<phrase revisionflag="deleted"> (note that this
  should never be the case if the rules on symbols and Content
  Dictionary names are applied), followed by the length of the
  Content Dictionary name as a byte (if the long flag was not set)
  or a four byte integer (in network byte order) followed by the
  length of the symbol name as a byte (if the long flag was not set)
  or a four byte integer (in network byte order),, followed by the
  characters of the Content Dictionary name, followed by the
  characters of the symbol name.</phrase>
<phrase revisionflag="added">. The symbol tags [8] and [8+128] are deprecated in &OM;2 since
  symbols now have an optional role field, but are
  kept for backwards compatibility. The symbol tag is  followed by the length of the
  Content Dictionary name, the symbol name, and the CD base as a byte (if the long flag was not set)
  or a four byte integers (in network byte order). These are followed by the
  characters of the Content Dictionary name, the symbol name, and the CD base.</phrase></para>
</listitem>
</varlistentry>

<varlistentry>
<term>Variables</term>
<listitem><para>are encoded using the variable tags
    (<phrase revisionflag="added">token identifiers</phrase> 5) with the long
  flag set if the number of bytes (characters) in the variable name is
  greater than or equal to 256 (this should never happen if the rules
  on variables are followed).  Then, there is the number of characters
  as a byte (if the long flag was not set) or a four byte integer
  (in network byte order), followed by the characters of the name of
  the variable. For example, the variable x is encoded as <systemitem>0x05
    0x01 0x78</systemitem>.</para>
</listitem>
</varlistentry>

<varlistentry revisionflag="added">
<term>Indexed Variables</term>
<listitem><para>are encoded using the indexed variable tags
    (token identifiers 10 and 11) as begin and end tags. The long
  flag set on the begin tag if the number of bytes (characters) in the variable name is
  greater than or equal to 256 (this should never happen if the rules
  on variables are followed).  The start tag is followed by the number of
  characters
  as a byte (if the long flag was not set) or a four byte integer
  (in network byte order), followed by the characters of the name of
  the variable. This is followed by the encoding of an &OM; object and the end tag
  [11].</para>
</listitem>
</varlistentry>


<varlistentry>
<term>Floating-point number</term>
<listitem><para>are encoded using the floating-point
  number tags (<phrase revisionflag="added">token identifier</phrase> 3) followed by eight bytes that are the IEEE 754
  representation&#160;<citation>ieee754_85</citation>, most significant bytes first. For
  example, 0.1 is encoded as <systemitem>0x03 0x000000000000f03f</systemitem>.</para>
</listitem>
</varlistentry>

<varlistentry>
<term>Character string</term>
<listitem><para>are encoded in two ways depending on whether
  the string contains <acronym>utf-16</acronym> characters or not. If the
  string contains only 8 bit characters, it is encoded as the one
  byte character string tags (<phrase revisionflag="added">token identifier</phrase> 6) with the long flag set if the number
  of bytes (characters) in the string is greater than or equal to 256.
  Then, there is the number of characters as a byte (if the length
  flag was not set) or a four byte integer (in network byte order),
  followed by the characters in the string. If the string contains two
  byte characters, it is encoded as the two byte character string
  tags (<phrase revisionflag="added">token identifier</phrase> 7) with the long flag set if the number of characters in the
  string is greater or equal to 256. Then, there is the number of
  characters as a byte (if the long flag was not set) or a four byte
  integer (in network byte order), followed by the characters
  (<acronym>utf-16</acronym> encoded  Unicode).</para>
</listitem>
</varlistentry>

<varlistentry>
<term>Bytearrays</term>
<listitem><para>are encoded using the bytearray tags (<phrase revisionflag="added">token identifier</phrase> 4) with the
  long flag set if the number <phrase revisionflag="deleted">of bytes in the
    number of </phrase> elements is
  greater than or equal to 256. Then, there is the number of elements,
  as a byte (if the long flag was not set) or a four byte integer
  (in network byte order), followed by the elements of the arrays in
  their normal order.</para>
</listitem>
</varlistentry>

<varlistentry revisionflag="added">
<term>Derived Objects</term>
<listitem>
  <para>are encoded using the derived object tags (token identifier 12) with the
  long flag set if the number of bytes is
  greater than or equal to 256. Then, there is the number of elements,
  as a byte (if the long flag was not set) or a four byte integer
  (in network byte order), followed by the elements of the arrays in
  their normal order.</para>
</listitem>
</varlistentry>

<varlistentry>
<term>Applications</term>
<listitem><para>are encoded using the application tags (<phrase revisionflag="added">token identifier</phrase> 16). More
  precisely, the application of <math><msub><mi>E</mi><mn>0</mn></msub></math> to
  <math><msub><mi>E</mi><mn>1</mn></msub></math><phrase>&#8230;</phrase>
  <math><msub><mi>E</mi><mi>n</mi></msub></math> is encoded
  using the application tags (<phrase revisionflag="added">token identifier</phrase> 16), the sequence of the encodings of
  <math><msub><mi>E</mi><mn>0</mn></msub></math> to
  <math><msub><mi>E</mi><mi>n</mi></msub></math> and the end application tags (<phrase revisionflag="added">token identifier</phrase> 17).</para>
</listitem>
</varlistentry>

<varlistentry>
 <term>Bindings</term>
 <listitem><para>are encoded using the binding tags (<phrase revisionflag="added">token identifier</phrase> 26). More
  precisely, the binding by <math><mi>B</mi></math> of variables <math><msub><mi>V</mi><mn>1</mn></msub></math><phrase>&#8230;</phrase> <math><msub><mi>V</mi><mi>n</mi></msub></math> in
  <math><mi>C</mi></math> is encoded as the binding tags (<phrase revisionflag="added">token identifier</phrase> 26), followed by the encoding of
  <math><mi>B</mi></math>, followed by the binding variables tags (<phrase revisionflag="added">token identifier</phrase> 28), followed by the
  encodings of the variables <math><msub><mi>V</mi><mn>1</mn></msub></math> <phrase>&#8230;</phrase> <math><msub><mi>V</mi><mi>n</mi></msub></math>, followed by the end
  binding variables tags (<phrase revisionflag="added">token identifier</phrase> 29), followed by the encoding of <math><mi>C</mi></math>,
  followed by the end binding tags (<phrase revisionflag="added">token identifier</phrase> 27).</para>
</listitem>
</varlistentry>

<varlistentry>
 <term>Attribution</term>
 <listitem><para>are encoded using the attribution
tags (<phrase revisionflag="added">token identifier</phrase> 18). More
  precisely, attribution of the object <math><mi>E</mi></math> with
  (<math><msub><mi>S</mi><mn>1</mn></msub></math>,
  <math><msub><mi>E</mi><mn>1</mn></msub></math>),
  <math><mi>&#8230;</mi></math> (<math><msub><mi>S</mi><mi>n</mi></msub></math>, <math><msub><mi>E</mi><mi>n</mi></msub></math>) pairs (where <math><msub><mi>S</mi><mi>i</mi></msub></math> are the attributes) is
  encoded as the attributed object tags (<phrase revisionflag="added">token identifier</phrase> 18), followed by the encoding
  of the attribute pairs as the attribute pairs tags (<phrase revisionflag="added">token identifier</phrase> 20), followed by
  the encoding of each symbol and value, followed by the end attribute
  pairs tags (<phrase revisionflag="added">token identifier</phrase> 21), followed by the encoding of <math><mi>E</mi></math>, followed by the end
  attributed object tags (<phrase revisionflag="added">token identifier</phrase> 19).</para>
</listitem>
</varlistentry>

<varlistentry>
<term>Error</term>
<listitem><para>are encoded using the error tags (<phrase revisionflag="added">token identifier</phrase> 22). More precisely,
  <math><msub><mi>S</mi><mn>0</mn></msub></math> applied to
  <math><msub><mi>E</mi><mn>1</mn></msub></math><phrase>&#8230;</phrase>
  <math><msub><mi>E</mi><mi>n</mi></msub></math> is encoded as the error tags (<phrase revisionflag="added">token identifier</phrase> 22),
  the encoding of <math><msub><mi>S</mi><mn>0</mn></msub></math>, the sequence of the
  encodings of <math><msub><mi>E</mi><mn>0</mn></msub></math> to
  <math><msub><mi>E</mi><mi>n</mi></msub></math> and the end error tags (<phrase revisionflag="added">token identifier</phrase> 23).</para>
</listitem>
</varlistentry>

<varlistentry revisionflag="added">
<term>Internal References</term>
<listitem>
  <para>are encoded using the internal reference tags [30] and [30+128] (the sharing flag cannot
  be set on this tag, since chains of references are not allowed in the &OM;
  binary encoding.) with   long flag set if the number of &OM; sub-objects in the
  encoded &OM; is
  greater than or equal to 256. Then, there is the ordinal number of the
  referenced &OM; object as a byte (if the long flag was not set) or a four byte integer
  (in network byte order).</para>
</listitem>
</varlistentry>

<varlistentry revisionflag="added">
<term>External References</term>
<listitem>
  <para>are encoded using the external reference tags [31] and [31+128] (the sharing flag cannot
  be set on this tag, since chains of references are not allowed in the &OM;
  binary encoding) with the
  long flag set if the number of bytes in the reference URI is
  greater than or equal to 256. Then, there is the number of bytes in the URI used
  for the external reference 
  as a byte (if the long flag was not set) or a four byte integer
  (in network byte order), followed by the URI.</para>
</listitem>
</varlistentry>

</variablelist> 
</para>

<section id="sec_sharing">
<title>Sharing <phrase revisionflag="added">in Objects begining with the identifier [24]</phrase></title>
 
<para>This binary encoding supports the sharing of symbols, variables and strings
(up to a certain length for strings) within one object. That is, sharing between
objects is not supported.  A reference to a shared symbol, variable or string is
encoded as the corresponding tag with the long flag not set and the shared flag
set, followed by a positive integer <math><mi>n</mi></math> coded on one byte (0
to 255). This integer references the <math><mi>n</mi> <mo>+</mo>
<mn>1</mn></math>-th such sharable sub-object (symbol, variable or string up to
255 characters) in the current &OM; object (counted in the order they are
generated by the encoding).  For example, <systemitem>0x48 0x01</systemitem>
references a symbol that is identical to the second symbol that was found in the
current object.  Strings with 8 bit characters and strings with 16 bit characters
are two different kinds of objects for this sharing. Only strings containing less
than 256 characters can be shared (i.e. only strings up to 255 characters).</para>
</section>
</section>

<section id="sec_sharing_references" revisionflag="added">
  <title>Sharing with References (beginning with [24+64])</title>

  <para>In the binary encoding specified in the last section (which we keep
for compatibility reasons, but deprecate in favor of the more
efficient binary encoding specified in this section) only symbols,
variables, and short strings could be shared. In this section, we will
present a second binary encoding, which shares most of the identifiers
with the one in the last one, but handles sharing differently. This
  encoding is signaled by the shared object tags [88].</para>

  <para>The main difference is the interpretation of the sharing flag (bit 7),
which can be set on all objects that allow it. Instead of encoding a reference to a
previous occurrence of an object of the same type, it indicates
whether an object will be referenced later in the encoding. This
  corresponds to the information, whether an <systemitem>id</systemitem>
 attribute is set
in the &exml; encoding. On the object identifier (where sharing does not
make sense), the shared flag signifies the encoding described here
([88]=[24+64]).
</para>

<para>Otherwise integers, floats, variables, symbols, strings, bytearrays, and constructs
are treated exactly as in the binary encoding described in the last section.</para>

<para>The binary encoding with references uses the additional reference tags [30]
for (short) internal references, [30+128] for long internal references, [30] for
(short) external references, [30+128] for long external references. Internal
references are used to share sub-objects in the encoded object (see <xref
linkend="fig_bin-enc2"/> for an example) by referencing their position; external
references allow to reference &OM; objects in other documents by an URI.</para>

<para>Identifiers [30+64] and [30+64+128] are not used, since they would encode
references that are shared themselves. Chains of references are redundant, and
decrease both space and time efficiency, therefore they are not allowed in the
&OM; binary encoding.</para>

<para>References consist of the identifier [30] ([30+128] for long references)
followed by a positive integer <math><mi>n</mi></math> coded on one byte (4 bytes for long
references). This integer references the
<math><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></math>th shared sub-object (one
where the 
shared flag is set) in the current object (counted in the order they are generated
in the encoding). For example <systemitem>Ox7E Ox01</systemitem> references the
second shared sub-object. Figure <xref linkend="fig_bin-enc2"/> shows the binary
encoding of the object in figure <xref linkend="fig_shared_vs_unshared"/>
above.</para>


<figure id="fig_bin-enc2">
    <title>A binary encoding of the &OM; object from figure <xref linkend="fig_shared_vs_unshared"/>.</title>
<informaltable>
<tgroup cols="4">
<thead>
<row>
<entry>Hex </entry>
<entry>Meaning </entry>
<entry>Hex </entry>
<entry>Meaning </entry>
</row>
</thead>
<tbody>
<row><entry>58</entry><entry>begin object tag</entry>
   <entry>05</entry><entry>variable tag</entry></row>
<row><entry>10</entry><entry>begin application tag</entry>
  <entry>01</entry><entry>variable length</entry></row>
<row><entry>05</entry><entry>variable tag</entry>
  <entry>61</entry><entry>a  (variable name)</entry></row>
<row><entry>01</entry><entry>variable length</entry>
  <entry>05</entry><entry>variable tag</entry></row>
<row><entry>66</entry><entry>f  (variable name)</entry>
  <entry>01</entry><entry>variable length</entry></row>
<row><entry>50</entry><entry>begin application tag (shared)</entry>
  <entry>61</entry><entry>a  (variable name)</entry></row>
<row><entry>05</entry><entry>variable tag</entry>
  <entry>11</entry><entry>end application tag</entry></row>
<row><entry>01</entry><entry>variable length</entry>
  <entry>1E</entry><entry>short reference</entry></row>
<row><entry>66</entry><entry>f  (variable name)</entry>
  <entry>00</entry><entry>to the first shared object</entry></row>
<row><entry>50</entry><entry>begin application tag (shared)</entry>
  <entry>11</entry><entry>end application tag</entry></row>
<row><entry>05</entry><entry>variable tag</entry>
  <entry>1E</entry><entry>short reference</entry></row>
<row><entry>01</entry><entry>variable length</entry>
  <entry>00</entry><entry>to the second shared object</entry></row>
<row><entry>66</entry><entry>f  (variable name)</entry>
  <entry>11</entry><entry>end application tag</entry></row>
<row><entry/><entry/><entry>19</entry><entry>end object tag</entry></row>
</tbody>
</tgroup>
</informaltable>
</figure>

<para>It is easy to see that in this binary encoding, the size of the encoding is
<math><mn>13</mn><mo>+</mo><mn>7</mn><mo
fence="true">(</mo><mi>d</mi><mo>-</mo><mn>1</mn><mo fence="true">)</mo></math> bytes,
where <math><mi>d</mi></math> is the depth of the tree, while a totally unshared encoding
is <math><mn>8</mn><mo>*</mo><msup><mn>2</mn><mi>d</mi></msup><mo>-</mo><mn>8</mn></math>
bytes (sharing variables saves up to 256 bytes for trees up to depth 8 and wastes space
for greater depths). The shared &exml; encoding only uses
<math><mn>32</mn><mi>d</mi><mo>+</mo><mn>29</mn></math> bytes, which is more space
efficient starting at depth 9.</para>

<para>Note that in conversion to binary encoding the identifiers on the
objects are not preserved. Morever, even though the &exml; encoding
allows references across objects, as in figure ???, the binary
encoding does not (the binary encoding has no notion of a multi-object
collection, which is implicit by embedding &OM; objects into &exml;
documents in the &exml; encoding.).</para>

<para>Note that objects need not be fully shared (or shared at all) in the
binary encoding with sharing.</para>
</section>

<section id="sec_impl_note">
<title>Implementation Note</title>

<para>A typical implementation of the binary encoding comes in two parts. The
  first part deals with the unshared encodings, i.e. objects starting with the
  identifier <systemitem>[24]</systemitem>.</para>

<para>This part uses four tables, each of 256 entries, for symbol, variables, 8
  bit character strings whose lengths are less than 256 characters and 16 bit
  character strings whose lengths are less than 256 characters.  When an object is
  read, all the tables are first flushed. Each time a sharable sub-object is read,
  it is entered in the corresponding table if it is not full. When a reference to
  the shared <math><mi>i</mi></math>-th object of a given type is read, it stands
  for the <math><mi>i</mi></math>-th entry in the corresponding table. It is an
  encoding error if the <math><mi>i</mi></math>-th position in the table has not
  already been assigned (i.e. forward references are not allowed).  Sharing is not
  mandatory, there may be duplicate entries in the tables (if the application that
  wrote the object chose not to share optimally).
</para>

<para revisionflag="added">
  The part for the shared representations of &OM; objects uses an unbounded
  array for storing shared sub-objects. Whenever an object has the shared flag
  set, then it is read and a pointer to the generated data structure is stored at
  the next position of the array. Whenever a reference of the form 
  <systemitem>[30] [_]</systemitem> is
  encountered, the array is queried for the value at <systemitem>[_]</systemitem>
  and analogously for or <systemitem>[30+128] {_}</systemitem>. Note that the
  application can decide to copy the value or share it among subterms as long as
  it respects the identity conditions given by the tree-nature of the &OM;
  objects.  The implementation must take care to ensure that no variables
  are captured during this process (see section
  <xref linkend="sec_sharing_bvars"/>), and possibly have methods for recovering
  from cyclic dependency relations (this can be done by standard loop-checking
  methods).
</para>

<para>Writing an object is simple. The tables are first flushed. Each time a
sharable sub-object is encountered (in the natural order of output given by the
encoding), it is either entered in the corresponding table (if it is not full) and
output in the normal way or replaced by the right reference if it is already
present in the table.</para>
</section>

<section id="sec_bin_example">
<title>Example of Binary Encoding</title>

<para>As an example of this binary encoding, we can consider the &OM; object
whose &exml; encoding is
<literallayout><![CDATA[ 
<OMOBJ>
  <OMA>
    <OMS cdbase="http://www.openmath.org/cd" name="times" cd="arith1"/>
    <OMA>
      <OMS cdbase="http://www.openmath.org/cd" name="plus" cd="arith1"/>
      <OMV name="x"/>
      <OMV name="y"/>
    </OMA>
    <OMA>
      <OMS cdbase="http://www.openmath.org/cd" name="plus" cd="arith1"/>
      <OMV name="x"/>
      <OMV name="z"/>
    </OMA>
  </OMA>
</OMOBJ>
]]></literallayout> 
It is binary encoded as the sequence of bytes given by  the following table.</para>

<informaltable>
<tgroup cols="4">
<thead>
<row>
<entry>Hex </entry>
<entry>Meaning </entry>
<entry> Hex </entry>
<entry>Meaning 
</entry>
</row>
</thead>
<tbody>
<row><entry>18</entry><entry>begin object tag</entry>
  <entry>68</entry><entry>h  .)</entry></row>
<row><entry>10</entry><entry> begin application tag</entry>
  <entry>31</entry><entry>1  .)</entry></row>
<row><entry>08</entry><entry>symbol tag</entry>
  <entry>70</entry><entry>p (symbol name begin</entry></row>
<row><entry>06</entry><entry>cd length </entry>
  <entry>6c</entry><entry>   l  .</entry></row>
<row><entry>05  </entry><entry>   name length</entry>
  <entry>75  </entry><entry>   u  . </entry></row>
<row><entry>61  </entry><entry>    a (cd name begin</entry>
  <entry>73  </entry><entry>   s  .) </entry></row>
<row><entry>72  </entry><entry>    r  .</entry>
  <entry>05  </entry><entry>   variable tag </entry></row>
<row><entry>69  </entry><entry>   i  .</entry>
  <entry>01  </entry><entry>   name length </entry></row>
<row><entry>74  </entry><entry>   t  .</entry>
  <entry>78  </entry><entry>   x (name) </entry></row>
<row><entry>68  </entry><entry>   h  .</entry>
  <entry>05  </entry><entry>   variable tag </entry></row>
<row><entry>31  </entry><entry>   1  .)</entry>
  <entry>01  </entry><entry>   name length </entry></row>
<row><entry>74  </entry><entry>   t (symbol name begin</entry>
  <entry>79  </entry><entry>   y (variable name) </entry></row>
<row><entry>69  </entry><entry>   i  .</entry>
  <entry>11  </entry><entry>   end application tag </entry></row>
<row><entry>6d  </entry><entry>   m  .</entry>
  <entry>10  </entry><entry>   begin application tag </entry></row>
<row><entry>65  </entry><entry>   e  .</entry>
  <entry>48  </entry><entry>   symbol tag (with share bit on) </entry></row>
<row><entry>73  </entry><entry>   s  .)</entry>
  <entry>01</entry><entry>reference to second symbol seen (arith1:plus)</entry></row>
<row><entry>10  </entry><entry>   begin application tag</entry>
  <entry>45  </entry><entry>   variable tag (with share bit on) </entry></row>
<row><entry>08  </entry><entry>   symbol tag</entry>
  <entry>00  </entry><entry>   reference to first variable seen (x) </entry></row>
<row><entry>06  </entry><entry>   cd length</entry>
  <entry>05  </entry><entry>   variable tag </entry></row>
<row><entry>04  </entry><entry>   name length</entry>
  <entry>01  </entry><entry>   name length </entry></row>
<row><entry>61  </entry><entry>   a (cd name begin</entry>
  <entry>7a  </entry><entry>   z (variable name) </entry></row>
<row><entry>72  </entry><entry>   r  .</entry>
  <entry>11  </entry><entry>   end application tag </entry></row>
<row><entry>69  </entry><entry>   i  .</entry>
  <entry>11  </entry><entry>   end application tag </entry></row>
<row><entry>74  </entry><entry>   t  .</entry>
  <entry>19  </entry><entry>   end object tag </entry></row>
</tbody>
</tgroup>
</informaltable> 

</section>

<section id="sec_relation_OM1_binary" revisionflag="added">
  <title>Relation to the &OM;1 binary encoding</title>
  <para>The &OM;2 binary encoding significantly extends the
    &OM;1 binary encoding to accomodate the new features and in particular sharing of
    sub-objects. The tags and structure of the  &OM;1 binary encoding are still
    present in the current &OM; binary encoding, so that binary encoded &OM;1 objects
    are still valid in the &OM;2 binary encoding and correspond to the same abstract
    &OM; objects. In some cases, the binary encoding tags without the shared flag
    can still be used as more compact representations of the objects (which are
    not shared, and do not have an identifier).
  </para>
  <para>As the binary encoding is geared towards compactness, &OM; objects should
    be maximally internally shared (if computationally feasible). Note that since
    sharing is done only at the
    encoding level, this does not alter the meaning of an &OM; object, only allow
    to represent it more compactly.
  </para>
</section>
</section>

<section id="sec_enc_summary">
<title>Summary</title>

<para>The key points of this chapter are:
<itemizedlist>
<listitem><para>The &exml; encoding for &OM; objects uses most common
  character sets.</para>
</listitem>
<listitem><para>The &exml; encoding is readable, writable and can be
  embedded in most documents and transport protocols.</para>
</listitem>
<listitem><para>The binary encoding for &OM; objects should be used when
  efficiency is a key issue. It is compact yet simple enough to allow
  fast encoding and decoding of objects.</para>
</listitem>
</itemizedlist>
</para>
</section>
</chapter>

<chapter id="cha_cd">
<title>Content Dictionaries</title>


<para>In this chapter we give a brief overview of Content Dictionaries
before explicitly stating their functionality and encoding.</para>
<section id="sec_cd_summary">
<title>Introduction</title>

<para>Content Dictionaries (CDs) are central to the &OM; philosophy of
transmitting mathematical information. It is the &OM; Content
Dictionaries which actually hold the meanings of the objects being
transmitted.</para>

<para>For example if application <math><mi>A</mi></math> is talking to
application <math><mi>B</mi></math>, and sends, say, an equation
involving multiplication of matrices, then <math><mi>A</mi></math> and
<math><mi>B</mi></math> must agree on what a matrix is, and on what
matrix multiplication is, and even on what constitutes an
equation. All this information is held within some Content
Dictionaries which both applications agree upon.</para>

<para>A <emphasis> Content Dictionary</emphasis> holds the meanings of
(various) mathematical <quote>words</quote>. These words are &OM;
basic objects referred to as <emphasis>symbols</emphasis> in <xref
linkend="sec_omabs"/>.</para>

<para>With a set of symbol definitions (perhaps from several Content
Dictionaries), <math><mi>A</mi></math> and <math><mi>B</mi></math> can
now talk in a common <quote>language</quote>.</para>

<para>It is important to stress that it is not Content Dictionaries
themselves which are being transmitted, but some <quote>mathematics</quote>
whose definitions are held within the Content Dictionaries. This means
that the applications must have already agreed on a set of Content
Dictionaries which they <quote>understand</quote> (i.e., can cope with
to some degree).</para>

<sidebar revision="1999/10/04" author="DPC"><para>Rephrase
slightly</para></sidebar> <para>In many cases, the Content
Dictionaries that an application understands will be constant, and be
intrinsic to the application's mathematical use. However the above
approach can also be used for applications which can handle every
Content Dictionary (such as an &OM; parser, or perhaps a typesetting
system), or alternatively for applications which understand a
changeable number of Content Dictionaries (perhaps after being sent
Content Dictionaries in some way).</para>

<para>The primary use of Content Dictionaries is thought to be for
designers of Phrasebooks,the programs which translate between the &OM;
mathematical object and the corresponding (often internal) structure
of the particular application in question. For such a use the Content
Dictionaries have themselves been designed to be as readable and
precise as possible.</para>

<para>Another possible use for &OM; Content Dictionaries could rely on
their automatic comprehension by a machine (e.g., when given
definitions of objects defined in terms of previously understood
ones), in which case Content Dictionaries may have to be passed as
data. Towards this end, a Content Dictionary has been written which
contains a set of symbols sufficient to represent any other Content
Dictionary. This means that Content Dictionaries may be passed in the
same way as other (&OM;) mathematical data.</para>

<sidebar revision="1999/08/24" author="OC"><para>More motivation on
design of CDs</para></sidebar> <para>Finally, the syntax of the
<phrase revisionflag="added">reference encoding for</phrase>
Content Dictionaries has been designed to be relatively easy to learn
and to write, and also free from the need for any specialist
software. This is because it is acknowledged that there is an enormous
amount of mathematical information to represent, and so most of the
Content Dictionaries will be written by <quote>ordinary</quote>
mathematicians, encoding their particular fields of expertise.  A
further reason is that the mathematics conveyed by a specific Content
Dictionary should be understandable independently of any
application.</para>

<para>The key points from this section are:
<itemizedlist>
<listitem><para>Content Dictionaries should be readable and precise to help
  Phrasebook designers,</para>
</listitem>
<listitem><para>Content Dictionaries should be readily write-able to encourage
  widespread use,</para>
</listitem>
<listitem><para>It ought to be possible for a machine to understand a Content
  Dictionary to some degree.</para>
</listitem>
</itemizedlist>
</para>
</section>

<section id="sect_func">
<title>Abstract Content Dictionaries</title>

<para>In this section we define the <phrase revisionflag="deleted">overall</phrase><phrase revisionflag="added">abstract</phrase> structure of Content
Dictionaries.</para>

<sidebar revision="1999/08/24" author="OC"><para>New paragraph to reflect recent changes</para></sidebar>
<para revisionflag="deleted">Other than Content Dictionary comments (which have no real semantics),
Content Dictionaries have been designed to hold two types of
information: that which is pertinent to the whole Content Dictionary,
and that which is restricted to a particular symbol definition.
Specific information pertaining to the symbols like the signature and
the defining mathematical properties is conveyed in additional files
associated to Content Dictionaries.</para>

<para revisionflag="deleted">Information that is pertinent to the whole Content Dictionary
includes:
<itemizedlist revisionflag="deleted">
<listitem><para>The name of the Content Dictionary.</para>
</listitem>
<listitem><para>A description of the Content Dictionary.</para>
</listitem>
<listitem><para>A date when the Content Dictionary is next planned to be reviewed.</para>
</listitem>
<listitem><para>A date on which the Content Dictionary was last edited.</para>
</listitem>
<listitem><para>The current version and revision  numbers of the Content Dictionary.</para>
</listitem>
<listitem><para>The status of the Content Dictionary.</para>
</listitem>
<listitem><para>An optional URL for this Content Dictionary.</para>
</listitem>
<listitem><para>An optional list of Content Dictionaries on which this Content
  Dictionary depends. That is, those named in Examples and FMP
  in this Content Dictionary.</para>
</listitem>
<listitem><para>An optional comment, possibly containing the author's name.</para>
</listitem>
</itemizedlist>
</para>

<para revisionflag="deleted">Information that is restricted to a particular symbol includes:
<itemizedlist revisionflag="deleted">
<listitem><para>The name of the symbol.</para>
</listitem>
<listitem><para>A description of this symbol.</para>
</listitem>
<listitem><para>An optional comment.</para>
</listitem>
<listitem><para>Optional properties that this symbol should obey.</para>
</listitem>
<listitem><para>Optional examples of the use of this symbol.</para>
 </listitem>
</itemizedlist>
</para>
<sidebar revision="1999/08/24" author="OC"><para>removed refs to old changes</para></sidebar>
<sidebar revision="1999/06/22" author="OC"><para>new paragraph</para></sidebar>
<sidebar revision="1999/08/24" author="OC"><para>Defmp added</para></sidebar>
<sidebar revision="1999/10/04" author="DPC"><para>Rephrase slightly</para></sidebar>

<para revisionflag="added">A Content Dictionary consists of the
following mandatory pieces of information:
<orderedlist revisionflag="added">
<listitem><para>A <emphasis>name</emphasis> corresponding to the rules
described in <xref linkend="sec_names"/>.</para>
</listitem>
<listitem><para>A <emphasis>description</emphasis> of the Content
Dictionary.
</para>
</listitem>
<listitem><para>A <emphasis>revision date</emphasis>, the date of the
last change to the Content Dictionary.  Dates should be stored in the
ISO-compliant format YYYY-MM-DD, e.g. 1966-02-03. 
</para>
</listitem>
<listitem><para>A <emphasis>review date</emphasis>, a date until which
the content dictionary is guarenteed to remain unchanged. 
</para>
</listitem>
<listitem><para>A <emphasis>version number</emphasis> which consists
of a major and minor part (see <xref linkend="sec_version"/>). 
</para>
</listitem>
<listitem><para>A <emphasis>status</emphasis>, as described in <xref
linkend="sec_status"/>. 
</para>
</listitem>
<listitem><para>A <emphasis>CD base</emphasis> which is a unique
identifier for the Content Dictionary, and may or may not refer to an
actual location from which it can be retrieved.   
</para>
</listitem>
<listitem><para>A series of <emphasis>symbol definitions</emphasis> as
described below.
</para>
</listitem>
</orderedlist>
</para>

<para revisionflag="added">A symbol definition consists of the
following pieces of information:
<orderedlist revisionflag="added">
<listitem><para>A mandatory <emphasis>name</emphasis> corresponding to the rules
described in <xref linkend="sec_names"/>.</para>
</listitem>
<listitem><para>A mandatory <emphasis>description</emphasis> of the symbol,
which can be as formal or informal as the author likes.
</para>
</listitem>
<listitem><para>An optional <emphasis>role</emphasis> as described in
<xref linkend="sec_roles"/>.
</para>
</listitem>
<listitem><para>Zero or more <emphasis>commented mathematical
properties</emphasis> which are mathematical properties of the symbol
expressed in a mechanism other than &OM;.
</para>
</listitem>
<listitem><para>Zero or more <emphasis>formal mathematical
properties</emphasis> which are mathematical properties of the symbol
expressed in &OM;.  Note that it is common for commented and formal
mathematical properties to be introduced in pairs, with the former
describing the latter.
</para>
</listitem>
<listitem><para>Zero or more <emphasis>examples</emphasis> which are
intended to demonstrate the use of the symbol within an &OM; object.
</para>
</listitem>
</orderedlist>
</para>

<para revisionflag="deleted">As mentioned earlier, certain kinds of data pertaining to
symbols may be conveyed in files other than a Content Dictionary.  In
particular, information on signatures according to a type system may
be described in <emphasis>Signature Files</emphasis> whose format is
given in <xref linkend="sigfiles"/>. Other information such as
presentation forms, extra defining mathematical properties may be
associated with Content Dictionaries using files whose format is not
specified by this standard. It is expected that a common method of
defining the presentation for &OM; symbols is via
<acronym>xsl</acronym>&#160;<citation>XSL_99</citation> stylesheets
giving transformations to MathML.</para>

<para revisionflag="added">
Some pieces of information which might logically be thought to be part
of a Content Dictionary, such as the types or signatures of symbols,
are better represented externally.  This allows for new varients to be
associated with Content Dictionaries without the Dictionaries
themselves being changed.  A model for signatures is given in <xref
linkend="sigfiles"/>.</para>

<sidebar revision="2000/04/10" author="DPC">
<para>MathML 2</para>
</sidebar>
<para>Content Dictionaries may be grouped into <emphasis>CD
Groups</emphasis>. These groups allow applications to easily refer to
collections of Content Dictionaries. One particular CDGroup of
interest is the <quote>MathML CDGroup</quote>. This group expresses
the collection of the core Content Dictionaries that is designed to
have the same semantic scope as the content elements of
MathML&#160;2&#160;<citation>MathML_2000</citation>.  &OM; objects
built from symbols that come from Content Dictionaries in this CDGroup
may be expected to be eaily transformed between &OM; and MathML
encodings.  The detailed structure of a CDGroup is described in
<xref linkend="ssec_cdgroups"/> below.</para>

<section revisionflag="added" id="sec_status">
<title>Content Dictionary Status</title>

  The status of a Content Dictionary can be either
<itemizedlist>
<listitem><para>
  <systemitem>official</systemitem>: approved by the &OM; Society
  according to the procedure outlined in <xref linkend="cdapprove"/>;
</para></listitem>

<listitem><para>
  <systemitem>experimental</systemitem>: under development and thus
liable to change;
</para></listitem>
<listitem><para>
  <systemitem>private</systemitem>: used by a private group of &OM;
  users;
</para></listitem>
<listitem><para>
<systemitem>obsolete</systemitem>: an obsolete Content
  Dictionary kept only for archival purposes.
</para></listitem>
</itemizedlist>
</section>

<section revisionflag="added" id="sec_version">
<title>Content Dictionary Version Numbers</title>

<para>A version number must consist of two parts, a major version and
a revision, both of which should be non-negative integers.  In CDs
that do not have status <emphasis>experimental</emphasis>, the version
number should be a positive integer.</para>

<para>Unless a CD has status <emphasis>experimental</emphasis>,
no changes should ever be
  introduced that invalidate objects built with previous versions.
  Any change that influences phrasebook compliance, like adding a new
  symbol to a Content Dictionary, is considered a major change
  and should be reflected by an increase in the major version number. Other
  changes, like adding an example or correcting a description, are
  considered minor changes. For minor changes the version number is not
  changed, but an increase should be made to the revision number.
  Note that a change such as removing a symbol should
  not be made unless the CD has status
<emphasis>experimental</emphasis>.
Should this be required then a new CD with a different name should be
  produced so as not to invalidate existing objects.</para>

<para>
   When the major version number
   is increased, the revision number is normally reset to zero.</para>

<para>As detailed in chapter&#160;<xref linkend="cha_comp"/>, &OM;
compliant applications state which versions of which CDs they support.
</para>

</section>

</section>

<section id="sec_xml_cd">
<title>The <phrase
revisionflag="deleted">&exml;</phrase><phrase revisionflag="added">Reference</phrase> Encoding for Content Dictionaries</title>




<para><phrase revisionflag="added">The reference encoding of</phrase>
Content Dictionaries are as &exml; documents.  A valid Content Dictionary
document should 
	<itemizedlist revisionflag="deleted">
	  <listitem><para>be valid according to the DTD given in <xref
		linkend="fig_cd-dtd"/>,</para>
	  </listitem>
	  <listitem><para>adhere to the extra conditions on the
	      content of the elements given in <xref
	      linkend="sect_pcdata"/>.</para>
	  </listitem>
	</itemizedlist>
<phrase revisionflag="added">conform to the Relax NG Schema for
Content Dictionaries given in <xref linkend="sec_cd_schema"/>.
</phrase>
</para>



<para>An example of a complete Content Dictionary is given in
Appendix&#160;<xref linkend="app_cdcd"/>, which is the
<systemitem>Meta</systemitem> Content Dictionary for describing
Content Dictionaries themselves. A more typical Content Dictionary is
given in Appendix&#160;<xref linkend="arith1.ocd"/>, the
<systemitem>arith1</systemitem> Content Dictionary for basic
arithmetic functions.</para>

<section id="sec_cd_schema" revisionflag="added">
<title>The RelaxNG Schema for Content Dictionaries</title>

<literallayout>
&cdrnc;
</literallayout>

</section>
<section id="sec_dtd_cd" revisionflag="deleted">
<title>The DTD Specification of  Content Dictionaries</title>


<figure id="fig_cd-dtd">
    <title>DTD Specification of  Content Dictionaries</title>
<literallayout><![CDATA[
<!-- DTD for OpenMath object -sb-29.10.1998 ->

<!--  general list of embeddable elements
      : excludes OMATP as this is only embeddable in OMATTR
      : excludes OMBVAR as this is only embeddable in OMBIND
-->
<!ENTITY % omel "OMS | OMV | OMI | OMB | OMSTR
                     | OMF | OMA | OMBIND | OME  | OMATTR  ">

<!-- things which can be variables -->
<!ENTITY % omvar        "OMV | OMATTR" >

<!-- symbol -->
<!ELEMENT OMS EMPTY>
<!ATTLIST OMS name CDATA #REQUIRED  cd CDATA #REQUIRED >

<!-- variable -->
<!ELEMENT OMV EMPTY>
<!ATTLIST OMV name CDATA #REQUIRED >

<!-- integer -->
<!ELEMENT OMI (#PCDATA) >

<!-- byte array -->
<!ELEMENT OMB (#PCDATA) >

<!-- string -->
<!ELEMENT OMSTR (#PCDATA) >

<!-- floating point -->
<!ELEMENT OMF EMPTY>
<!ATTLIST OMF dec CDATA #IMPLIED  hex CDATA #IMPLIED>

<!-- apply constructor -->
<!ELEMENT OMA (%omel;)+ >

<!-- binding constructor & variable -->
<!ELEMENT OMBIND ((%omel;), OMBVAR, (%omel;)) >
<!ELEMENT OMBVAR (%omvar;)+ >

<!-- error -->
<!ELEMENT OME    (OMS, (%omel;)* ) >

<!-- attribution constructor & attribute pair constructor -->
<!ELEMENT OMATTR (OMATP, (%omel;)) >
<!ELEMENT OMATP (OMS, (%omel;))+ >

<!-- OM object constructor -->
<!ELEMENT OMOBJ (%omel;) >

<!-- end of DTD for OM object -->

]]>
</literallayout>


</figure>


<para>The &exml; DTD for Content Dictionaries is given in
<xref linkend="fig_cd-dtd"/>. The allowed elements are further
described in the following section.</para>
</section>

<section id="sect_pcdata">
<title>Further <phrase revisionflag="deleted">Requirements of an &OM;
Content Dictionary</phrase><phrase revisionflag="added">Description of
the CD Schema</phrase></title>


<para revisionflag="deleted">The notion of being a valid Content Dictionary is stronger than merely
being successfully parsed by the DTD. This is because the content of
the elements, referred to in <xref linkend="fig_cd-dtd"/> as PCDATA and
CDATA, must actually make sense to, say, a Phrasebook designer. In
this section we define exactly the format of the elements used in
Content Dictionaries.</para>

<para revisonflag="added">
We now describe the elements used in the above schema in terms of the
abstract description of CDs in <xref linkend="sect_func"/>.  Unless
stated otherwise the information is encoded as the content of the
element.
</para>


<sidebar revision="1999/06/20" author="OC">
<para>now we have this numbering mechanism, should it be documented?</para>
</sidebar>
<variablelist>
<varlistentry><term><systemitem>CDName</systemitem></term><listitem><para>The
<phrase revisionflag="deleted">
  text occurring in the <systemitem>CDName</systemitem> element
  corresponds to the</phrase> name of the Content Dictionary.
</para>

</listitem>
</varlistentry>
<varlistentry>
<term><systemitem>Description</systemitem></term>
<listitem><para>The text occurring in the <systemitem>Description</systemitem>
  element is used to give a description of the enclosing element, which
  could be a symbol or the entire Content Dictionary. The content of
  this element can be any &exml; text.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDReviewDate</systemitem></term><listitem><para>The
<phrase revisionflag="deleted">
  text occurring in the <systemitem>CDReviewDate</systemitem> element
  corresponds to the earliest possible
</phrase>
review date of the Content
  Dictionary. <phrase revisionflag="deleted">The date formats should be ISO-compliant in the form
  YYYY-MM-DD, e.g. 1953-09-26.</phrase></para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDDate</systemitem></term><listitem><para>The
<phrase revisionflag="deleted">
text occurring in the <systemitem>CDDate</systemitem> element
  corresponds to the
</phrase>
revision date of this version of the Content Dictionary.
<phrase revisionflag="deleted">
  The date formats should be ISO-compliant in the form YYYY-MM-DD,
  e.g. 1953-09-26.
</phrase>
</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDVersion</systemitem></term><listitem>
   <sidebar revision="1999/06/23" author="DPC"><para>new paragraph</para></sidebar>
   <sidebar revision="1999/11/24" author="DPC"><para>Now just an integre</para></sidebar>

<para revisionflag="added">The major version number of the CD.</para>
   <para revisionflag="deleted">The text occurring in the <systemitem>CDVersion</systemitem> element corresponds to
   the version number of the current version of a Content Dictionary.
   It should be a non negative integer.</para>

<para revisionflag="deleted">In CDs that do not have status <emphasis>experimental</emphasis>, CD version
  numbering should adhere to the following. The version number should
  be a positive integer.</para>

<para revisionflag="deleted">No changes can be
  introduced that invalidate objects built with previous versions.
  Any change that influences phrasebook compliance, like adding a new
  symbol to a Content Dictionary, is considered a major change.
  and should be reflected by an increase in this version number. Other
  changes, like adding an example or correcting a description, are
  considered minor changes. For minor changes the version number is not
  changed, but an increas should be made to the revision number, as
  described below. A change such as removing a symbol should
  not be made, instead a new CD, with a different name should be
  produced, so as not to invalidate existing objects.</para>

<para revisionflag="deleted">As detailed in chapter&#160;<xref linkend="cha_comp"/>, &OM; compliant applications
  state which versions of which CDs they support.

  <emphasis>Experimental</emphasis> CDs may expect to have changes such as adding
  or removing symbols as they are developed, without requiring the name
  of the CD to be changed.</para>

  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDRevision</systemitem></term><listitem>
   <sidebar revision="1999/11/24" author="DPC"><para
revisionflag="deleted">New field,
   formally `.y' of version number</para></sidebar> <para
revisionflag="deleted">The text
   occurring in the <systemitem>CDRevision</systemitem> element
   corresponds to the revision, or `minor version number' of the
   current version of a Content Dictionary.  It should be a non
   negative integer.</para>

<para revisionflag="deleted">Minor changes to a CD that do not warrant the release of a CD with
   an increased version number should be marked by increasing the
   revision number specified in this field. When the Cd Version number
   is increased, the Revision number is normally reset to zero.</para>

<para revisionflag="added">The minor version number of the
CD.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDStatus</systemitem></term><listitem><para>The
<phrase revisionflag="deleted">
  text occurring in the <systemitem>CDStatus</systemitem> element
  corresponds to the
</phrase>
status of the Content Dictionary.
<phrase revisionflag="deleted">
, and can be either
  <systemitem>official</systemitem> (approved by the &OM; Society
  according to the procedure outlined in <xref linkend="cdapprove"/>),
  <systemitem>experimental</systemitem> (currently being tested),
  <systemitem>private</systemitem> (used by a private group of &OM;
  users) or <systemitem>obsolete</systemitem> (an obsolete Content
  Dictionary kept only for archival purposes).
</phrase>
</para>
  
</listitem>
</varlistentry>
<varlistentry revisionflag="added"><term><systemitem>CDCDBASE</systemitem></term><listitem><para>The
CD base of the CD.

</para>
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDURL</systemitem></term><listitem><para>The
  text occurring in the <systemitem>CDURL</systemitem> element should
  be a valid URL where the source file for the Content Dictionary
  encoding can be found (if it exists). The filename should conform to
  ISO 9660&#160;<citation>iso9660</citation>.

</para>

</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDUses</systemitem></term><listitem>
   <sidebar revision="1999/06/23" author="DPC"><para>new
   wording</para></sidebar> <para>The content of this element should
   be a series of <systemitem>CDName</systemitem> elements, each
   naming a Content Dictionary used in the
   <systemitem>Example</systemitem> and <systemitem>FMP</systemitem>s
   of the current Content Dictionary. <phrase
revisionflag="added">This element is optional and deprecated since
the information can easily be extracted automatically.</phrase></para>
   
 </listitem>
</varlistentry>
<varlistentry><term><systemitem>CDComment</systemitem></term><listitem><para>The
   content of this element should be text that does not convey any
   crucial information concerning the current Content Dictionary. It
   can be used in the Content Dictionary header to report the author
   of the Content Dictionary and to log change information. In the
   body of the Content Dictionary, it can be used to attach extra
   remarks to certain symbols.</para> <sidebar revision="1999/10/01"
   author="OC"><para>Due to lack of inspiration, I added only these
   few lines</para></sidebar>
   
 </listitem>
</varlistentry>
<varlistentry revisionflag="added"><term><systemitem>CDDefinition</systemitem></term><listitem><para>The
element which contains the definition of an individual symbol.
</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>Name</systemitem></term><listitem><para>The
<phrase revisionflag="deleted">
  text occurring in the <systemitem>Name</systemitem> element
  corresponds to the
</phrase>
name of a symbol.
<phrase revisionflag="deleted">
, and is specified as in <xref linkend="cha_enco"/>.
</phrase>
</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>Example</systemitem></term>
<listitem>
<sidebar revision="1999/06/23" author="OC"><para>new
description</para></sidebar> <para>The text occurring in the
<systemitem>Example</systemitem> element is used to give examples of
the enclosing symbol, and can be any &exml; text. In addition to text
the element may contain examples as &exml; encoded &OM;, inside
<systemitem>OMOBJ</systemitem> elements.  Note that
<systemitem>Examples</systemitem> must be with respect to some symbol
and cannot be <quote>loose</quote> in the Content Dictionary.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CMP</systemitem></term>
<listitem><para>

<phrase revisionflag="deleted">
The text occurring in the <systemitem>CMP</systemitem> element
  corresponds to a property of the symbol. An application which says
  it understands a Content Dictionary symbol need not understand a
  commented property of the symbol.
</phrase>
<phrase revisionflag="added">
A Commented Mathematical Property.
</phrase>

</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>FMP</systemitem></term><listitem><para>

<phrase revisionflag="deleted">
The
  content of the <systemitem>FMP</systemitem> element also corresponds
  to a property<footnote id="ftn_theory"><para>It corresponds to a
  theorem of a theory in some formal system.</para></footnote> of the
  symbol, however the content of this element must be a valid &OM;
  object in the &exml; encoding.  An application which says it
  understands a Content Dictionary symbol need not understand a formal
  property of the symbol.
</phrase>
<phrase revisionflag="added">
A Formal Mathematical Property.
</phrase>

</para>
</listitem>
</varlistentry>
</variablelist>
</section>
</section>


<section id="addfiles">
<title>Additional Information</title>


<sidebar revision="1999/08/25" author="OC"><para>Introduction to
splitting-up in files</para></sidebar> <sidebar revision="1999/10/04"
author="DPC"><para>Rephrase slightly</para></sidebar> <para>Content
Dictionaries contain just one part of the information that can be
associated to a symbol in order to stepwise define its meaning and its
functionality. &OM; Signature 
<phrase revisionflag="deleted">files</phrase><phrase
revisionflag="added">dictionaries</phrase>, CDGroups, and possibly
<phrase revisionflag="deleted">files</phrase><phrase
revisionflag="added">collections</phrase>
of extra mathematical properties, are used to convey the different
aspects that as a whole make up a mathematical definition.</para>

<section id="sigfiles">
<title>Signature
<phrase revisionflag="deleted">Files</phrase><phrase
revisionflag="added">Dictionaries</phrase>
</title>


<sidebar revision="1999/08/25" author="OC"><para>Introduced Signature
  Files. Early drafts of the &OM; standard specified that Content
  Dictionaries had a Signature element in which the
  <emphasis>signature</emphasis> of the symbol was defined. The
  disadvantage of this approach is that the signature would need to
  reference a specific type system. Signature Files allow for more
  generality.</para></sidebar>

<para>&OM; may be used with any type system. One just needs to produce
a Content Dictionary which gives the constructors of the type system,
and then one may build &OM; objects representing types in the given
type system. These are typically associated with &OM; objects via the
&OM; <varname>attribution</varname> constructor.</para>

<para>A Small Type System, called STS, has been designed to give
semi-formal signatures to &OM; symbols and is documented
in&#160;<citation>OM_D132c</citation>.  The signature file given in
<xref linkend="arith1.sts"/> is based on this formalism. Using the
same mechanism, <citation>OMD132b</citation> shows how pure type
systems can also be employed to assign types to &OM; symbols.</para>


<section id="sec_dtd_sig" revisionflag="deleted">
<title>The  DTD Specification of Signature Files</title>

<para>Signature Files are &exml; documents, hence a valid Signature
 File should
<itemizedlist>
<listitem><para>be valid according to the <acronym>dtd</acronym> given in
  <xref linkend="fig_omcdsig.dtd"/>,</para>
</listitem>
<listitem><para>adhere to the extra conditions on the content of the elements
  given in <xref linkend="sect_sigpcdata"/>.</para>
</listitem>
</itemizedlist></para>


<para>Signature files have a header which specifies the Content
Dictionary and determines the type system being used, and the Content
Dictionary which contains the symbols for which the signatures are
being given. Each signature takes the form of an &exml; encoded &OM;
object.</para>


<figure id="fig_omcdsig.dtd">
    <title>DTD Specification of Signature Files</title>
<literallayout><![CDATA[
<!-- omcdsig.dtd -->
<!-- ********************************************* -->
<!--                                               -->
<!-- DTD for OpenMath CD Signatures                -->
<!-- (c) EP24969 the ESPRIT OpenMath Consortium    -->
<!-- David Carlisle 1999-04-13                     -->
<!-- David Carlisle 1999-05-21                     -->
<!-- David Carlisle 1999-06-22                     -->
<!--                                               -->
<!--                                               -->
<!-- ********************************************* -->

<!-- include dtd for OM objects -->
<!ENTITY  % omobjectdtd SYSTEM "omobj.dtd" >
%omobjectdtd;

<!ELEMENT CDSComment      (#PCDATA) >
<!ELEMENT CDSReviewDate    (#PCDATA) >
<!ELEMENT CDSStatus    (#PCDATA) >

<!ELEMENT CDSignatures   (CDComment |CDSComment | CDSReviewDate |
                         CDSStatus | Signature )* >

<!ATTLIST CDSignatures cd CDATA #REQUIRED
                       type CDATA #REQUIRED >

<!ELEMENT Signature      (OMOBJ?) >

<!ATTLIST  Signature  name CDATA #REQUIRED >

<!-- end of DTD for OM CD Signatures -->]]>
</literallayout>
</figure>
</section>

<section id="sect_sigpcdata">
<title><phrase revisionflag="deleted">Further
Requirements
</phrase>
<phrase revisionflag="added">
Abstract Specification</phrase>
 of a Signature File</title>

<sidebar revision="1999/08/26" author="OC"><para>Added PCDATA for Additional Files</para></sidebar>

<para revisionflag="added">Signature files have a header which specifies the
type system being used, and the Content
Dictionary which contains the symbols for which the signatures are
being given. Each signature takes the form of an &OM;
object in an appropriate encoding.</para>

<para revisionflag="deleted">The notion of being a valid Signature File is stronger than
merely being successfully parsed by the <acronym>dtd</acronym> in
<xref linkend="fig_omcdsig.dtd"/>.  In this section we define exactly
the format of the elements used in Signature Files. Several of the
requirements are the same as those on elements of Contents
Dictionaries.</para>


<variablelist revisionflag="deleted">
<varlistentry><term><systemitem>CDSignatures</systemitem></term><listitem><para>The
  outermost element of the Signature File is characterized by two
  required attributes that identify the type system and the Content
  Dictionary whose signatures are defined. The value of the &exml;
  attribute <systemitem>type</systemitem> is the name of the Content
  Dictionary or of the CDGroup (cfg. <xref linkend="ssec_cdgroups"/>)
  that represents the type system. The value of the &exml; attribute
  <systemitem>cd</systemitem> is the name of the Content Dictionary
  whose symbols are assigned signatures in this Signature File. Both
  values are of the form specified in <xref
  linkend="cha_enco"/>.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDSComment</systemitem></term><listitem><para>See
  <systemitem>CDComment</systemitem> in <xref
  linkend="sect_pcdata"/>.</para>

</listitem>
</varlistentry>

<varlistentry><term><systemitem>CDSreviewDate</systemitem></term><listitem><para>The
  text occurring in the <systemitem>CDSReviewDate</systemitem> element
  corresponds to the earliest possible revision date of the Signature
  File.  The date formats should be ISO-compliant in the form
  YYYY-MM-DD, e.g. 2000-02-29.</para>
  </listitem>
</varlistentry>

<varlistentry><term><systemitem>CDSStatus</systemitem></term><listitem><para>The
  text occurring in the <systemitem>CDSStatus</systemitem> element
  corresponds to the status of the Signature File, and can be either
  <systemitem>official</systemitem> (approved by the &OM; Society
  according to the procedure outlined in <xref linkend="cdapprove"/>),
  <systemitem>experimental</systemitem> (currently being tested),
  <systemitem>private</systemitem> (used by a private group of &OM;
  users) or <systemitem>obsolete</systemitem> (an obsolete Signature
  File kept only for archival purposes).</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>Signature</systemitem></term>
<listitem>
<sidebar revision="1999/08/01" author="OC">
<para>This notion might be too strict, it also need CDUses
possibly</para>
</sidebar>
<para>The content of the <systemitem>Signature</systemitem> element
  has to be a valid &OM; object in &exml; encoding as specified in
  <xref linkend="cha_enco"/>. Additionally, the object must represent
  a valid type in the type system identified by the &exml; attribute
  <systemitem>type</systemitem> of the
  <systemitem>CDSignature</systemitem> element. See <xref
  linkend="sect_sigex"/> for examples.</para>

</listitem>
</varlistentry>
</variablelist>

<orderedlist revisionflag="added">
<listitem><para>
A <emphasis>type definition</emphasis>: the
  name of the Content
  Dictionary or of the CDGroup (cfg. <xref linkend="ssec_cdgroups"/>)
  that represents the type system being used.

</para></listitem>
<listitem><para>
A <emphasis>CD name</emphasis>: the name of the CD for which
signatures are being defined.

</para></listitem>
<listitem><para>
A <emphasis>review date</emphasis>
as defined in <xref linkend="sect_func"/>.
</para></listitem>
<listitem><para>
A <emphasis>status</emphasis>:
as defined in <xref linkend="sect_func"/>.
</para></listitem>
<listitem><para>
A series of <emphasis>signatures</emphasis> which are &OM; objects in
some encoding.  The objects must represent types as defined by the
type definition.
</para>
</listitem>
</orderedlist>

</section>


<section id="sect_sigschema" revisionflag="added">
<title>A RelaxNG Schema for a Signature File</title>

<para>
The following is a reference encoding of a signature dictionary,
designed to be used with Content Dictionaries in the &exml; encoding.
</para>

<literallayout>
&sigrnc;
</literallayout>

</section>


<section id="sect_sigex">
<title>Examples</title>
<sidebar revision="1999/08/01" author="OC">
<para>arith1.sts is not valid wrt DTD</para>
</sidebar>
<para>An example of a signature file for the type system STS and the
<systemitem>arith1</systemitem> Content Dictionary is given in <xref
linkend="arith1.sts"/>. Each signature entry is similar to the
following one for the &OM; symbol <systemitem>&lt;OMS cd="arith1"
name="plus"/></systemitem>: <literallayout><![CDATA[
<Signature name="plus">
<OMOBJ>
 <OMA>
  <OMS cdbase="http://www.openmath.org/cd" name="mapsto" cd="sts"/>
  <OMA>
   <OMS cdbase="http://www.openmath.org/cd" name="nassoc" cd="sts"/> 
   <OMV name="AbelianSemiGroup"/>
  </OMA>
  <OMV name="AbelianSemiGroup"/>
 </OMA>
</OMOBJ>
</Signature>
]]></literallayout>
</para>
</section>



</section>

<section id="ssec_cdgroups">
<title>CDGroups</title>



<sidebar revision="1999/06/20" author="OC"><para>All new, partly taken
from SB paper</para></sidebar> <sidebar revision="1999/10/04"
author="DPC"><para>Rephrase slightly</para></sidebar> <para>The CD
Group mechanism is a convenience mechanism for identifying collections
of CDs.  A CD Group file is an &exml; document used in the (static or
dynamic) negotiation phase where communicating applications declare
and agree on the Content Dictionaries which they process.  It is a
complement, or an alternative, to the individual declaration of
Content Dictionaries understood by an application.  Note that CD
Groups do <emphasis>not</emphasis> affect the &OM; objects themselves.
Symbols in an object always refer to content dictionaries, not
groups.</para>

<sidebar revision="1999/06/20" author="OC"><para>Does this go to
compliancy?</para></sidebar> <para>For an application to declare that
it <quote>understands CDGroup G</quote> is exactly equivalent to, and
interchangable with, the declaration that it <quote>understands
Content Dictionaries <math><msub><mi>x</mi><mn>1</mn></msub></math>,
<math><msub><mi>x</mi><mn>2</mn></msub></math>, <phrase>&#8230;</phrase>
<math><msub><mi>x</mi><mi>n</mi></msub></math></quote>, where
<math><msub><mi>x</mi><mn>1</mn></msub></math>, <phrase>&#8230;</phrase>
<math><msub><mi>x</mi><mi>n</mi></msub></math> are the members of
CDGroup G.</para>


<section id="sec_dtd_cdg">
<title>The DTD Specification of CDGroups</title>


<para>CDGroups are &exml; documents, hence  a valid  CDGroup
 should 
<itemizedlist>
<listitem><para>be valid according to the DTD given in
  <xref linkend="fig_cdgroup.dtd"/>,</para>
</listitem>
<listitem><para>adhere to the extra conditions on the content of the elements
  given in <xref linkend="sect_cdgpcdata"/>.</para>
</listitem>
</itemizedlist>
</para>

<para>Apart from some header information such as <systemitem>CDGroupName</systemitem> and
<systemitem>CDGroup</systemitem> version, a CDGroup is simply an unordered list of
CDs, identified by name and optionally version number and URL.</para>


<figure id="fig_cdgroup.dtd">
    <title><phrase revisionflag="deleted">DTD</phrase><phrase
    revisionflag="added">Relax NG</phrase>Specification of CDGroups</title>
<literallayout>
&cdgrouprnc;
</literallayout>

</figure>
</section>

<section id="sect_cdgpcdata">
<title>Further Requirements of a CDGroup</title>


<sidebar revision="1999/08/26" author="OC"><para>Added PCDATA for CDGroup</para></sidebar>

<para>The notion of being a valid CDGroup implies that the following
requirements on the content of the elements described by the DTD in
<xref linkend="fig_omcdsig.dtd"/> are also met.</para>


<variablelist>
<varlistentry><term><systemitem>CDGroup</systemitem></term>
<listitem><para>The &exml; element <systemitem>CDGroup</systemitem> is the outermost
  element in a CDGroup document.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDGroupName</systemitem></term>
<listitem>
<sidebar revision="1999/08/01" author="OC">
 <para>For consistency, CDGName would be better</para>
</sidebar>
<para>The text occurring in the <systemitem>CDGroupName</systemitem>
  element corresponds to the name of the CDGroup. For the syntactical
  requirements, see <systemitem>CDName</systemitem> in <xref linkend="sect_pcdata"/>.</para>
  
</listitem>
</varlistentry>
<varlistentry revisionflag="added"><term><systemitem>CDGroupVersion</systemitem></term>
</varlistentry>
<varlistentry revisionflag="added"><term><systemitem>CDGroupRevision</systemitem></term>
<listitem>
<para>The text occurring in these elements contains the major and minor
version numbers of the CDGroup.
</para>
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDGroupURL</systemitem></term>
<listitem><para>The text occurring in the <systemitem>CDGroupURL</systemitem>
  element identifies the location of the CDGroup file, not necessarily
  of the member Content Dictionaries. For the syntactical
  requirements, see <systemitem>CDURL</systemitem> in <xref linkend="sect_pcdata"/>.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDGroupDescription</systemitem></term>
<listitem><para>The text occurring in the
<systemitem>CDGroupDescription</systemitem> element describes the
mathematical area of the CDGroup.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDGroupMember</systemitem></term>
<listitem><para>The &exml; element <systemitem>CDGroupMember</systemitem>
  encloses the data identifying each member of the CDGroup.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDName</systemitem></term><listitem><para>The
  text occurring in the <systemitem>CDName</systemitem> element
  corresponds to the name of a Content Dictionary in the CDGroup. For
  the syntactical requirements, see <systemitem>CDName</systemitem> in
  <xref linkend="sect_pcdata"/>.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDVersion</systemitem></term><listitem><para>The
  text occurring in the <systemitem>CDVersion</systemitem> element
  identifies which version of the Content Dictionary isto be taken as
  member of the CDGroup. This element is optional. In case it is
  missing, the latest version is the one included in the CDGroup.  For
  the syntactical requirements, see <systemitem>CDVersion</systemitem>
  in <xref linkend="sect_pcdata"/>.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDURL</systemitem></term>
<listitem>
<sidebar revision="1999/08/01" author="OC">
<para>Or the official CD repository?</para>
</sidebar>
<para>The text occurring in the <systemitem>CDURL</systemitem> element
  identifies the location of the Content Dictionary to be taken as
  member of the CDGroup. This element is optional. In case it is
  missing, the location of the CDGroup identified by the element
  <systemitem>CDGroupURL</systemitem> is assumed.  For the syntactical
  requirements, see <systemitem>CDURL</systemitem> in <xref
  linkend="sect_pcdata"/>.</para>
  
</listitem>
</varlistentry>
<varlistentry><term><systemitem>CDComment</systemitem></term><listitem><para>See
  <systemitem>CDComment</systemitem> in <xref
  linkend="sect_pcdata"/>.</para>



</listitem>
</varlistentry>
</variablelist>




<sidebar revision="1999/10/04" author="DPC">
<para>Delete subsec: Note on Symbols, CDs and CDGroups</para>
</sidebar>
<sidebar revision="2000/04/10" author="DPC">
<para>Delete examples (MathML CDGroup is in appendix, core CDGroup no longer exists</para>
</sidebar>
<sidebar revision="1999/08/25" author="OC">
<para>This section to be added</para>
</sidebar>
<sidebar revision="1999/10/04" author="DPC">
<para>Delete subsec: DefMP Files and XSL</para>
</sidebar>
</section>
</section>
</section>

<section id="cdapprove">
<title>Content Dictionaries Reviewing Process</title>


<sidebar revision="1999/10/04" author="DPC"><para>Rephrase slightly</para></sidebar>
<para>The &OM; Society is responsible  for implementing a
review and referee process to assess the accuracy of the mathematical
content of Content Dictionaries.  The status (see <systemitem>CDStatus</systemitem>)
and/or the version number (see <systemitem>CDVersion</systemitem> ) of a Content
Dictionary may change as a result of this review process.</para>
</section>
</chapter>





<chapter id="cha_comp">
<title>&OM; Compliance</title>

<sidebar revision="1999/11/24" author="DPC/OC">
<para>New chapter, after discussions at Esprit &OM; meeting in Bath</para>
</sidebar>
<para>Applications that meet the requirements specified in this chapter may
label themselves as <emphasis>&OM; compliant</emphasis>. &OM; compliancy is
defined so as to maximize the potential for interoperability amongst
&OM; applications.</para>

<section id="sec_compl_encoding">
<title>Encoding</title>
<para>This standard defines two reference encodings for &OM;, the binary
encoding and &exml; encoding,  defined in <xref linkend="cha_enco"/>.</para>

<para>As a minimum, an &OM; compliant application, which accepts or generates
&OM; objects, <emphasis>must</emphasis> be capable of doing so using  the &exml; encoding.
The ability to use other encodings is optional.</para>
</section>

<section id="sec_compl_cd">
<title>Content Dictionaries</title>

<para>An &OM; compliant application <emphasis>must</emphasis> be able
to support the error Content Dictionary defined in <xref
linkend="errorcd"/>.</para>

<para>A compliant application must declare the names and version numbers of
the Content Dictionaries that it supports. Equivalently it may declare
the Content Dictionary Group (or groups) and major version number (not
revision number), rather than listing individual Content Dictionaries.
Applications that support all Content Dictionaries (e.g. renderers)
should refer to the implicit CD Group <systemitem>all</systemitem>.</para>

<para>If a compliant application supports a Content Dictionary then it must
explicitly declare any symbols in the Content Dictionaries that are not
supported. Phrasebooks are encouraged to support every symbol in the 
Content Dictionaries.</para>

<para>Symbols which are not listed as unsupported are
<emphasis>supported</emphasis> by the application. The meaning of
<emphasis>supported</emphasis> will depend on the application
domain. For example an &OM; renderer should provide a default display
for any &OM; object that only references supported symbols, whereas a
Computer Algebra System will be expected to map such an object to a
suitable internal representation, in this system, of this mathematical
object. It is expected that the application's
<emphasis>phrasebooks</emphasis> for supported Content Dictionaries
will be constructed such that propertes of the symbol expressed in the
Content Dictionary are respected as far as possible for the given
application domain. However &OM; compliance does
<emphasis>not</emphasis> imply any guarantee by the &OM; Society on
the accuracy of these representations.</para>


<para>Content Dictionaries available from the official &OM; repository
at www.openmath.org need only be referenced by name, other Content
Dictionaries <emphasis>should</emphasis> be referenced <phrase
revisionflag="deleted">by the URL declared in the
<systemitem>CDURL</systemitem> field of the Dictionary. This URL may
be used to retrieve the Content Dictionary.</phrase> <phrase
revisionflag="added"></phrase> using the
<systemitem>CDBASE</systemitem> and the
<systemitem>CDName</systemitem>.  </para>

<para>When receiving an &OM; symbol, e.g. <math><mi>s</mi></math>,
 that is not supported from a supported Content Dictionary, a
 compliant application will act as if it had received the &OM; object
 <math display="block"><mi
 mathvariant="bold">error</mi><mo>(</mo><mi>Unhandled_Symbol</mi><mo
 separator="true">,</mo><mi>s</mi><mo>)</mo></math> where
 <systemitem>Unhandled_Symbol</systemitem> is the symbol from the
 error Content Dictionary.</para>


<para>Similarly if it receives a symbol, e.g. <math><mi>s</mi></math>,
from an unsupported Content Dictionary, it will act as if it had
received the &OM; object <math display="block"><mi
mathvariant="bold">error</mi><mo>(</mo><mi>Unsupported_CD</mi><mo
separator="true">,</mo><mi>s</mi><mo>)</mo></math></para>

<para>Finally if the compliant application receives a symbol from a
supported Content Dictionary but with an unknown name, then this must
either be an incorrect object, or possibly the object has been built
using a later version of the Content Dictionary. In either case, the
application will act as if it had received the &OM; object <math
display="block"><mi
mathvariant="bold">error</mi><mo>(</mo><mi>Unexpected_Symbol</mi><mo
separator="true">,</mo><mi>s</mi><mo>)</mo></math></para>
</section>

<section id="sec_comp_lex">
<title>Lexical Errors</title>

<para>The previous section defines the behaviour of a compliant
application upon receiving well formed &OM; objects containing
unexpected symbols.  This standard does not specify any behaviour for
an application upon receiving ill-formed objects.</para>
</section>
</chapter>

<chapter id="cha_conc">
<title>Conclusion</title>


<para>The goal of this document is to define the &OM; standard. The
things are addressed by the &OM; standard are:
<itemizedlist>
<listitem><para>Informal and formal definition of the &OM; objects.</para>
  
</listitem>
<listitem><para>Informal and formal definition of the notion of Content
  Dictionaries.</para>
</listitem>
</itemizedlist>
To do this, &OM; objects are precisely defined and two encodings are
described to represent these objects using <acronym>xml</acronym> and
binary code. Furthermore, the Document Type Definition for validating
Content Dictionaries and &OM; objects is given.</para>


</chapter>


<appendix id="app_cdfiles">
<title>CD Files</title>

<section id="app_cdcd">
<title>The <filename>meta</filename> Content Dictionary</title>

<literallayout><![CDATA[
<CD>

  <CDName> meta </CDName>

  <Description> 
    
    This is a content dictionary to represent content dictionaries, so
    that they may be passed between &OM; compliant application in a
    similar way to mathematical objects.  It is acknowledged that this is
    not the only way to do this, but it seems a natural way.
    
    This can be viewed as updating the previous Meta-CD.
    
    The information written here is taken from "The &OM; Standard".
    This document is a slightly stronger statement than "the following
    symbols are defined as in the DTD at
    http://www.nag.co.uk/projects/OpenMath/omstd/dtds/cd.dtd", since the
    DTD often only says that the information inside the elements is PCDATA
    without saying what this actually corresponds to. However this is the
    only way this document is better than the DTD, and thus this is the
    only extra information we give here.
    
    Author: N. Howgrave-Graham
  </Description>
  
  <CDReviewDate> 1998-10-01 </CDReviewDate>
  <CDStatus> experimental </CDStatus>
  <CDURL> http://www.nag.co.uk/projects/OpenMath/omstd/cds/meta.ocd </CDURL>
  
  <CDComment>
    This is how one uses comments.
    
    This whole document must be valid &exml; which means that we cannot have
    sub-elements inside elements where we are expecting PCDATA. For this
    reason it is suggested that one use the unicode characters when
    clashes occur. For example &lt; and &gt; for less than and more than.
  </CDComment>
  
  <CDDefinition>
    <Name> CD </Name>
    <Description>
      The DTD fully specifies the use of the CD tag
    </Description>
  </CDDefinition>
  
  <CDDefinition>
    <Name> CDDescription </Name>
    <Description>
      The DTD fully specifies the use of the CDDescription tag
    </Description>
  </CDDefinition>
  
  <CDComment>
    For those that do not have access to the DTD, the tagged entries
    are the following (in no particular order):
    
    &lt;CD&gt;
    &lt;CDName&gt; &lt;/CDName&gt;
    &lt;Description&gt; &lt;/Description&gt;
    &lt;CDReviewDate&gt; &lt;/CDReviewDate&gt;
    &lt;CDStatus&gt; &lt;/CDStatus&gt;
    &lt;CDURL&gt;? &lt;/CDURL&gt;
    &lt;CDUses&gt;? &lt;CDUses&gt;
    &lt;CDDefinition&gt;*
    &lt;Name&gt; &lt;/Name&gt;
    &lt;Description&gt; &lt;/Description&gt;
    &lt;Signature&gt;? &lt;/Signature&gt;
    &lt;Example&gt;* &lt;/Example&gt;
    &lt;FMP&gt;* &lt;/FMP&gt;
    &lt;CMP&gt;* &lt;/CMP&gt;
    &lt;Presentation&gt;? &lt;/Presentation&gt;
    &lt;/CDDefinition&gt;
    
    where an asterisk (?) denotes it can repeated 0 or 1 times, and a star
    (*) denotes 0 or more times.
  </CDComment>
  
  <CDDefinition>
    <Name> CDName </Name>
    <Description>
      A tag which contains PCDATA corresponding to the name of the CD.
    </Description>
  </CDDefinition>
  
  <CDDefinition>
    <Name> CDURL </Name>
    <Description>
      An optional tag which contains PCDATA corresponding to the URL where
      the CD is stored.
    </Description>
  </CDDefinition>
  
  <CDDefinition>
    <Name> Example </Name>
    <Description>
      A tag which contains PCDATA to give an example of the
      enclosing symbol definition.
    </Description>
  </CDDefinition>
  
  <CDDefinition>
    <Name> CDReviewDate </Name>
    <Description>
      A tag which contains PCDATA to give an expiry date of
      the CD.  It should be in the form of ISO-8601, i.e. YYYY-MM-DD
    </Description>
  </CDDefinition>
  
  <CDDefinition>
    <Name> CDStatus </Name>
    <Description>
      A tag which contains PCDATA to give information on the
      status of the CD. This can be either official (approved by the
      &OM; steering committee), experimental (currently being tested),
      private (used by a private group of &OM; users) or obsolete
      (an obsolete CD kept only for archival purposes).
    </Description>
  </CDDefinition>
  
  <CDDefinition>
    <Name> CDUses </Name>
    <Description>
      A tag which contains zero or more CDNames which correspond
      to the CD's that this CD depends on. This makes an inheritance
      structure for CD's. If the CD is dependent on any other CD's they must
be present here.
</Description>
</CDDefinition>

<CDDefinition>
  <Name> CDTypeUses </Name>
  <Description>
    A tag which contains zero or more CDNames which correspond
    to the CD's that hold type information that this CD depends on. This
    makes an inheritance type structure for CD's. If the CD types are
    dependent on any other CD's they must be present here. For application
    that do not respect types, this symbol can be ignored.
  </Description>
</CDDefinition>

<CDDefinition>
  <Name> Description </Name>
  <Description>
    A tag which contains PCDATA corresponding to the
    description of either the CD or the symbol (depending on which is the
    enclosing element).
  </Description>
</CDDefinition>

<CDDefinition>
  <Name> Name </Name>
  <Description>
    A tag which contains PCDATA corresponding to the name of
    the symbol being defined.
  </Description>
</CDDefinition>

<CDDefinition>
  <Name> Signature </Name>
  <Description>
    An optional tag which contains PCDATA corresponding to
    the type of the symbol being defined. This type information will be
    an &OM; type object as defined in chapter 5 of "First Draft of the
    &OM; Standard".
  </Description>
</CDDefinition>

<CDDefinition>
  <Name> Presentation </Name>
  <Description>
    An optional tag (which may be repeated many times) which contains
    PCDATA corresponding to a way of presenting the symbol being defined.
  </Description>
</CDDefinition>

<CDDefinition>
  <Name> CMP </Name>
  <Description>
    An optional tag (which may be repeated many times) which contains
    PCDATA corresponding to a property of the symbol being
    defined.
  </Description>
</CDDefinition>

<CDDefinition>
  <Name> FMP </Name>
  <Description>
    An optional tag (which may be repeated many times) which contains
    PCDATA corresponding to a property of the symbol being
    defined. This property must be a valid &OM; object.
  </Description>
</CDDefinition>

</CD>
]]></literallayout>
</section>

<section id="arith1.ocd">
  <title>The  <filename>arith1</filename> Content Dictionary File</title>
  
  
  <literallayout><![CDATA[
  <CD>
    <CDName> arith1 </CDName>
    <CDURL> http://www.openmath.org/cd/arith1.ocd </CDURL>
    <CDReviewDate> 2003-04-01 </CDReviewDate>
    <CDStatus> official </CDStatus>
    <CDDate> 2001-03-12 </CDDate>
    <CDVersion> 2 </CDVersion>
    <CDRevision> 0 </CDRevision>
    
    <Description> 
      This CD defines symbols for common arithmetic functions.
    </Description>
    
    <CDDefinition>
      <Name> lcm </Name>
      <Description> 
	The symbol to represent the n-ary function to return the least common
	multiple of its arguments.
      </Description>
      
      <CMP> lcm(a,b) = a*b/gcd(a,b) </CMP>
      
      <FMP>
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="lcm"/>
	      <OMV name="a"/>
	      <OMV name="b"/>
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="divide"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		<OMV name="a"/>
		<OMV name="b"/>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="gcd"/>
		<OMV name="a"/>
		<OMV name="b"/>
	      </OMA>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </FMP>
      <CMP>
	for all integers a,b |
	There does not exist a c>0 such that c/a is an Integer and c/b is an
	Integer and lcm(a,b) > c.
      </CMP>
      
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	      <OMV name="b"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="implies"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="and"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
		  <OMV name="a"/>
		  <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="Z"/>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
		  <OMV name="b"/>
		  <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="Z"/>
		</OMA>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="not"/>
		<OMBIND>
		  <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="exists"/>
		  <OMBVAR>
		    <OMV name="c"/>
		  </OMBVAR>
		  <OMA>
		    <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="and"/>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="gt"/>
		      <OMV name="c"/>
		      <OMI>0</OMI>
		    </OMA>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="integer1" name="factorof"/>
		      <OMV name="a"/>
		      <OMV name="c"/>
		    </OMA>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="integer1" name="factorof"/>
		      <OMV name="b"/>
		      <OMV name="c"/>
		    </OMA>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="lt"/>
		      <OMV name="c"/>
		      <OMA>
			<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="lcm"/>
			<OMV name="a"/>
			<OMV name="b"/>
		      </OMA>
		    </OMA>
		  </OMA>
		</OMBIND>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
    </CDDefinition>
    
    <CDDefinition>
      <Name> gcd </Name>
      <Description> 
	The symbol to represent the n-ary function to return the gcd (greatest
	common divisor) of its arguments.
      </Description>
      
      <CMP>
	for all integers a,b |
	There does not exist a c such that a/c is an Integer and b/c is an
	Integer and c > gcd(a,b).
	
	Note that this implies that gcd(a,b) > 0
      </CMP>
      
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	      <OMV name="b"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="implies"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="and"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
		  <OMV name="a"/>
		  <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="Z"/>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
		  <OMV name="b"/>
		  <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="Z"/>
		</OMA>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="not"/>
		<OMBIND>
		  <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="exists"/>
		  <OMBVAR>
		    <OMV name="c"/>
		  </OMBVAR>
		  <OMA>
		    <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="and"/>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
		      <OMA>
			<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="divide"/>
			<OMV name="a"/>
			<OMV name="c"/>
		      </OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="Z"/>
		    </OMA>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
		      <OMA>
			<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="divide"/>
			<OMV name="b"/>
			<OMV name="c"/>
		      </OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="Z"/>
		    </OMA>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="gt"/>
		      <OMV name="c"/>
		      <OMA>
			<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="gcd"/>
			<OMV name="a"/>
			<OMV name="b"/>
		      </OMA>
		    </OMA>
		  </OMA>
		</OMBIND>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
      
      <Example>
	gcd(6,9) = 3
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="gcd"/>
	      <OMI> 6 </OMI>
	      <OMI> 9 </OMI>
	    </OMA>
	    <OMI> 3 </OMI>
	  </OMA>
	</OMOBJ>
      </Example>
    </CDDefinition>
    
    <CDDefinition>
      <Name> plus </Name>
      <Description>
	The symbol representing an n-ary commutative function plus.
      </Description>
      <CMP> for all a,b | a + b = b + a </CMP>
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	      <OMV name="b"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		<OMV name="a"/>
		<OMV name="b"/>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		<OMV name="b"/>
		<OMV name="a"/>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
    </CDDefinition>
    
    <CDDefinition>
      <Name> unary_minus </Name>
      <Description> 
	This symbol denotes unary minus, i.e. the additive inverse.
      </Description>
      <CMP> for all a | a + (-a) = 0 </CMP>
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		<OMV name="a"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="unary_minus"/>
		  <OMV name="a"/>
		</OMA>
	      </OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="zero"/>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
    </CDDefinition>
    
    <CDDefinition>
      <Name> minus </Name>
      <Description> 
	The symbol representing a binary minus function. This is equivalent to
	adding the additive inverse.
      </Description>
      <CMP> for all a,b | a - b = a + (-b) </CMP>
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	      <OMV name="b"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="minus"/>
		<OMV name="a"/>
		<OMV name="b"/>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		<OMV name="a"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="unary_minus"/>
		  <OMV name="b"/>
		</OMA>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
    </CDDefinition>
    
    <CDDefinition>
      <Name> times </Name>
      <Description> 
	The symbol representing an n-ary multiplication function.
      </Description>
      <Example>
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrix"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		  <OMI> 1 </OMI>
		  <OMI> 2 </OMI>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		  <OMI> 3 </OMI>
		  <OMI> 4 </OMI>
		</OMA>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrix"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		  <OMI> 5 </OMI>
		  <OMI> 6 </OMI>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		  <OMI> 7 </OMI>
		  <OMI> 8 </OMI>
		</OMA>
	      </OMA>
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrix"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		<OMI> 19 </OMI>
		<OMI> 20 </OMI>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		<OMI> 43 </OMI>
		<OMI> 50 </OMI>
	      </OMA>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </Example>
      <CMP> for all a,b | a * 0 = 0 and a * b = a * (b - 1) + a </CMP>
      
      <FMP><OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	      <OMV name="b"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="and"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		  <OMV name="a"/>
		  <OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="zero"/>
		</OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="zero"/>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		  <OMV name="a"/>
		  <OMV name="b"/>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		  <OMA>
		    <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		    <OMV name="a"/>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="minus"/>
		      <OMV name="b"/>
		      <OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="one"/>
		    </OMA>
		  </OMA>
		  <OMV name="a"/>
		</OMA>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ></FMP>
      
      <CMP> for all a,b,c | a*(b+c) = a*b + a*c </CMP>
      <FMP><OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	      <OMV name="b"/>
	      <OMV name="c"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		<OMV name="a"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		  <OMV name="b"/>
		  <OMV name="c"/>
		</OMA>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		  <OMV name="a"/>
		  <OMV name="b"/>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		  <OMV name="a"/>
		  <OMV name="c"/>
		</OMA>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ></FMP>
    </CDDefinition>
    
    <CDDefinition>
      <Name> divide </Name>
      <Description>
	This symbol represents a (binary) division function denoting the first argument
	right-divided by the second, i.e. divide(a,b)=a*inverse(b). It is the
	inverse of the multiplication function defined by the symbol times in this CD.
      </Description>
      <CMP> whenever not(a=0) then a/a = 1 </CMP>
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="implies"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="neq"/>
		<OMV name="a"/>
		<OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="zero"/>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="divide"/>
		  <OMV name="a"/>
		  <OMV name="a"/>
		</OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="one"/>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
    </CDDefinition>
    
    <CDDefinition>
      <Name> power </Name>
      <Description>
	This symbol represents a power function. The first argument is raised
	to the power of the second argument. When the second argument is not
	an integer, powering is defined in terms of exponentials and 
	logarithms for the complex and real numbers.
	This operator can represent general powering.
      </Description>
      
      <CMP>
	x\in C implies x^a = exp(a ln x)
      </CMP>
      
      <FMP>
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="implies"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
	      <OMV name="x"/>
	      <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="C"/>
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" name="power" cd="arith1"/>
		<OMV name="x"/>
		<OMV name="a"/>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" name="exp" cd="transc1"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" name="times" cd="arith1"/>
		  <OMV name="a"/>
		  <OMA>
		    <OMS cdbase="http://www.openmath.org/cd" name="ln" cd="transc1"/>
		    <OMV name="x"/>
		  </OMA>
		</OMA>
	      </OMA>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </FMP>
      
      <CMP>
	if n is an integer then
	x^0 = 1,
	x^n = x * x^(n-1)
      </CMP>
      <FMP>
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="implies"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
	      <OMV name="n"/>
	      <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="Z"/>
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="and"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="power"/>
		  <OMV name="x"/>
		  <OMI>0</OMI>
		</OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="one"/>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="power"/>
		  <OMV name="x"/>
		  <OMV name="n"/>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		  <OMV name="x"/>
		  <OMA>
		    <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="power"/>
		    <OMV name="x"/>
		    <OMA>
		      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="minus"/>
		      <OMV name="n"/>
		      <OMI>1</OMI>
		    </OMA>
		  </OMA>
		</OMA>
	      </OMA>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </FMP>
      <Example>
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="power"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrix"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		  <OMI> 1 </OMI>
		  <OMI> 2 </OMI>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		  <OMI> 3 </OMI>
		  <OMI> 4 </OMI>
		</OMA>
	      </OMA>
	      <OMI>3</OMI>
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrix"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		<OMI> 37 </OMI>
		<OMI> 54 </OMI>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="linalg2" name="matrixrow"/>
		<OMI> 81 </OMI>
		<OMI> 118 </OMI>
	      </OMA>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </Example>
      <Example>
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="power"/>
	      <OMS cdbase="http://www.openmath.org/cd" cd="nums1" name="e"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="times"/>
		<OMS cdbase="http://www.openmath.org/cd" cd="nums1" name="i"/>
		<OMS cdbase="http://www.openmath.org/cd" cd="nums1" name="pi"/>
	      </OMA>
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="unary_minus"/>
	      <OMS cdbase="http://www.openmath.org/cd" cd="alg1" name="one"/>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </Example>
    </CDDefinition>
    
    <CDDefinition>
      <Name> abs </Name>
      <Description> 
	A unary operator which represents the absolute value of its
	argument. The argument should be numerically valued.
	In the complex case this is often referred to as the modulus.
      </Description>
      <CMP> for all x,y | abs(x) + abs(y) >= abs(x+y) </CMP>
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="x"/>
	      <OMV name="y"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="geq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="abs"/>
		  <OMV name="x"/>
		  <OMV name="y"/>
		</OMA>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="abs"/>
		  <OMV name="x"/>
		  <OMV name="y"/>
		</OMA>
	      </OMA>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="abs"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plus"/>
		  <OMV name="x"/>
		  <OMV name="y"/>
		</OMA>
	      </OMA>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
    </CDDefinition>
    
    <CDDefinition>
      <Name> root </Name>
      <Description> 
	A binary operator which represents its first argument "lowered" to its
	n'th root where n is the second argument. This is the inverse of the operation
	represented by the power symbol defined in this CD.
	
	Care should be taken as to the precise meaning of this operator, in
	particular which root is represented, however it is here to represent
	the general notion of taking n'th roots. As inferred by the signature
	relevant to this symbol, the function represented by this symbol is
	the single valued function, the specific root returned is the one
	indicated by the first CMP. Note also that the converse of the second
	CMP is not valid in general.
      </Description>
      
      <CMP> x\in C implies root(x,n) = exp(ln(x)/n) </CMP>
      <FMP>
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="logic1" name="implies"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="set1" name="in"/>
	      <OMV name="x"/>
	      <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="C"/>
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="root"/>
		<OMV name="x"/>
		<OMV name="n"/>          
	      </OMA>
	      <OMA>
		<OMS name="exp" cd="transc1"/>
		<OMA>
		  <OMS name="divide" cd="arith1"/>
		  <OMA>
		    <OMS name="ln" cd="transc1"/>
		    <OMV name="x"/>
		  </OMA>
		  <OMV name="n"/>          
		</OMA>
	      </OMA>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </FMP>
      
      <CMP> for all a,n | power(root(a,n),n) = a (if the root exists!) </CMP>
      <FMP>
	<OMOBJ>
	  <OMBIND>
	    <OMS cdbase="http://www.openmath.org/cd" cd="quant1" name="forall"/>
	    <OMBVAR>
	      <OMV name="a"/>
	      <OMV name="n"/>
	    </OMBVAR>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="power"/>
		<OMA>
		  <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="root"/>
		  <OMV name="a"/>
		  <OMV name="n"/>
		</OMA>
		<OMV name="n"/>
	      </OMA>
	      <OMV name="a"/>
	    </OMA>
	  </OMBIND>
	</OMOBJ>
      </FMP>
    </CDDefinition>
    
    
    
    
    <CDDefinition>
      <Name> sum </Name>
      <Description>
	An operator taking two arguments, the first being the range of summation,
	e.g. an integral interval, the second being the function to be
	summed. Note that the sum may be over an infinite interval.
      </Description>
      <Example>
	This represents the summation of the reciprocals of all the integers between
	1 and 10 inclusive.
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="sum"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="interval1" name="integer_interval"/>
	      <OMI> 1 </OMI>
	      <OMI> 10 </OMI>
	    </OMA>
	    <OMBIND>
	      <OMS cdbase="http://www.openmath.org/cd" cd="fns1" name="lambda"/>
	      <OMBVAR>
		<OMV name="x"/>
	      </OMBVAR>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="divide"/>
		<OMI> 1 </OMI>
		<OMV name="x"/>
	      </OMA>
	    </OMBIND>
	  </OMA>
	</OMOBJ>
      </Example>
    </CDDefinition>
    
    <CDDefinition>
      <Name> product </Name>
      <Description>
	An operator taking two arguments, the first being the range of multiplication
	e.g. an integral interval, the second being the function to
	be multiplied. Note that the product may be over an infinite interval. 
      </Description>
      <Example>
	This represents the statement that the factorial of n is equal to the product
	of all the integers between 1 and n inclusive.
	<OMOBJ>
	  <OMA>
	    <OMS cdbase="http://www.openmath.org/cd" cd="relation1" name="eq"/>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="integer1" name="factorial"/>
	      <OMV name="n" />
	    </OMA>
	    <OMA>
	      <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="product"/>
	      <OMA>
		<OMS cdbase="http://www.openmath.org/cd" cd="interval1" name="integer_interval"/>
		<OMI> 1 </OMI>
		<OMV name="n"/>
	      </OMA>
	      <OMBIND>
		<OMS cdbase="http://www.openmath.org/cd" cd="fns1" name="lambda"/>
		<OMBVAR>
		  <OMV name="i"/>
		</OMBVAR>
		<OMV name="i"/>
	      </OMBIND>
	    </OMA>
	  </OMA>
	</OMOBJ>
      </Example>
    </CDDefinition>
    
  </CD>]]>
</literallayout>

</section>

<section id="arith1.sts">
  <title>The  <filename>arith1</filename> STS Signature File</title>
  
  <sidebar revision="1999/07/16" author="DPC"><para>ADD arith1 signature file</para></sidebar>
  
  <literallayout><![CDATA[
  <CDSignatures type="sts" cd="arith1">
    
    <CDSComment>
      Date:  1999-11-26
      Author: David Carlisle
    </CDSComment>
    
    <Signature name="lcm" >
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts" />
	  <OMA>
	    <OMS name="nassoc" cd="sts"/>
	    <OMV name="SemiGroup"/>
	  </OMA>
	  <OMV name="SemiGroup" />
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="gcd" >
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts" />
	  <OMA>
	    <OMS name="nassoc" cd="sts"/>
	    <OMV name="SemiGroup"/>
	  </OMA>
	  <OMV name="SemiGroup" />
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="plus">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMA>
	    <OMS name="nassoc" cd="sts"/> 
	    <OMV name="AbelianSemiGroup"/>
	  </OMA>
	  <OMV name="AbelianSemiGroup"/>
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="unary_minus">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMV name="AbelianGroup"/> 
	  <OMV name="AbelianGroup"/> 
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="minus">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMV name="AbelianGroup"/> 
	  <OMV name="AbelianGroup"/> 
	  <OMV name="AbelianGroup"/> 
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="times">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMA>
	    <OMS name="nassoc" cd="sts"/> 
	    <OMV name="SemiGroup"/>
	  </OMA>
	  <OMV name="SemiGroup"/>
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="divide">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMV name="AbelianGroup"/> 
	  <OMV name="AbelianGroup"/> 
	  <OMV name="AbelianGroup"/> 
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="power">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMS name="NumericalValue" cd="sts"/> 
	  <OMS name="NumericalValue" cd="sts"/> 
	  <OMS name="NumericalValue" cd="sts"/> 
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="abs">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMS name="C" cd="setname1"/> 
	  <OMS name="R" cd="setname1"/> 
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="root">
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts"/>
	  <OMS name="NumericalValue" cd="sts"/> 
	  <OMS name="NumericalValue" cd="sts"/> 
	  <OMS name="NumericalValue" cd="sts"/> 
	</OMA>
      </OMOBJ>
    </Signature>
    
    
    <Signature name="sum" >
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts" />
	  <OMV name="IntegerRange" />
	  <OMA>
	    <OMS name="mapsto" cd="sts" />
	    <OMS name="Z" cd="setname1" />
	    <OMV name="AbelianMonoid" />
	  </OMA>
	  <OMV name="AbelianMonoid" />
	</OMA>
      </OMOBJ>
    </Signature>
    
    <Signature name="product" >
      <OMOBJ>
	<OMA>
	  <OMS name="mapsto" cd="sts" />
	  <OMV name="IntegerRange" />
	  <OMA>
	    <OMS name="mapsto" cd="sts" />
	    <OMS name="Z" cd="setname1" />
	    <OMV name="AbelianMonoid" />
	  </OMA>
	  <OMV name="AbelianMonoid" />
	</OMA>
      </OMOBJ>
    </Signature>
    
  </CDSignatures>]]>
</literallayout>

</section>

<section id="mathml.cdg">
  <title>The  <filename>MathML</filename> CDGroup</title>
  <sidebar revision="1999/08/26" author="OC"><para>ADD MathML CDGroup</para></sidebar>
  
  <literallayout><![CDATA[
  <CDGroup>
    <CDGroupName>mathml</CDGroupName>
    <CDGroupVersion> 2 </CDGroupVersion>
    <CDGroupRevision> 0 </CDGroupRevision>
    <CDGroupURL>
      http://www.openmath.org/cdfiles/cdgroups/mathml.ocd</CDGroupURL>
    <CDGroupDescription> MathML compatibility CD Group </CDGroupDescription>
    <CDComment>This is the first version of the Core CD group.
      It was created by D Carlisle based on MathML CD Group.</CDComment>
    <CDComment>Algebra</CDComment>
    <CDGroupMember>
      <CDName>alg1</CDName>
      <CDURL>http://www.openmath.org/cd/alg1.ocd</CDURL></CDGroupMember>
    <CDComment>Arithmetic</CDComment>
    <CDGroupMember>
      <CDName>arith1</CDName>
      <CDURL>http://www.openmath.org/cd/arith1.ocd</CDURL></CDGroupMember>
    <CDComment>Constructor for Floating Point Numbers</CDComment>
    <CDGroupMember>
      <CDName>bigfloat1</CDName>
      <CDURL>http://www.openmath.org/cd/bigfloat1.ocd</CDURL></CDGroupMember>
    <CDComment>Calculus</CDComment>
    <CDGroupMember>
      <CDName>calculus1</CDName>
      <CDURL>http://www.openmath.org/cd/calculus1.ocd</CDURL></CDGroupMember>
    <CDComment>Operations on and constructors for complex numbers</CDComment>
    <CDGroupMember>
      <CDName>complex1</CDName>
      <CDURL>http://www.openmath.org/cd/complex1.ocd</CDURL></CDGroupMember>
    <CDComment>Functions on functions</CDComment>
    <CDGroupMember>
      <CDName>fns1</CDName>
      <CDURL>http://www.openmath.org/cd/fns1.ocd</CDURL></CDGroupMember>
    <CDComment>Integer arithmetic</CDComment>
    <CDGroupMember>
      <CDName>integer1</CDName>
      <CDURL>http://www.openmath.org/cd/integer1.ocd</CDURL></CDGroupMember>
    <CDComment>Intervals</CDComment>
    <CDGroupMember>
      <CDName>interval1</CDName>
      <CDURL>http://www.openmath.org/cd/interval1.ocd</CDURL></CDGroupMember>
    <CDComment>Linear Algebra - vector &amp; matrix constructors, those symbols which are independant of orientation, but in MathML</CDComment>
    <CDGroupMember>
      <CDName>linalg1</CDName>
      <CDURL>http://www.openmath.org/cd/linalg1.ocd</CDURL></CDGroupMember>
    <CDComment>Linear Algebra - vector &amp; matrix constructors, those symbols which are dependant of orientation, and in MathML</CDComment>
    <CDGroupMember>
      <CDName>linalg2</CDName>
      <CDURL>http://www.openmath.org/cd/linalg2.ocd</CDURL></CDGroupMember>
    <CDComment>Limits of unary functions</CDComment>
    <CDGroupMember>
      <CDName>limit1</CDName>
      <CDURL>http://www.openmath.org/cd/limit1.ocd</CDURL></CDGroupMember>
    <CDComment>List constructors</CDComment>
    <CDGroupMember>
      <CDName>list1</CDName>
      <CDURL>http://www.openmath.org/cd/list1.ocd</CDURL></CDGroupMember>
    <CDComment>Basic logical operators</CDComment>
    <CDGroupMember>
      <CDName>logic1</CDName>
      <CDURL>http://www.openmath.org/cd/logic1.ocd</CDURL></CDGroupMember>
    <CDComment>
      MathML Numerical Types
    </CDComment>
    <CDGroupMember>
      <CDName>mathmltypes</CDName>
      <CDURL>http://www.openmath.org/cd/mathmltypes.ocd</CDURL>
    </CDGroupMember>
    <CDComment>Minima and maxima</CDComment>
    <CDGroupMember>
      <CDName>minmax1</CDName>
      <CDURL>http://www.openmath.org/cd/minmax1.ocd</CDURL></CDGroupMember>
    <CDComment>Multset-theoretic operators and constructors</CDComment>
    <CDGroupMember>
      <CDName>multiset1</CDName>
      <CDURL>http://www.openmath.org/cd/multiset1.ocd</CDURL></CDGroupMember>
    <CDComment>Symbols for creating numbers, including some defined constants
      (which can be seen as nullary constructors)</CDComment>
    <CDGroupMember>
      <CDName>nums1</CDName>
      <CDURL>http://www.openmath.org/cd/nums1.ocd</CDURL></CDGroupMember>
    <CDComment>Symbols for creating piecewise definitions</CDComment>
    <CDGroupMember>
      <CDName>piece1</CDName>
      <CDURL>http://www.openmath.org/cd/piece1.ocd</CDURL></CDGroupMember>
    <CDComment>The basic quantifiers forall and exists.</CDComment>
    <CDGroupMember>
      <CDName>quant1</CDName>
      <CDURL>http://www.openmath.org/cd/quant1.ocd</CDURL></CDGroupMember>
    <CDComment>Common arithmetic relations</CDComment>
    <CDGroupMember>
      <CDName>relation1</CDName>
      <CDURL>http://www.openmath.org/cd/relation1.ocd</CDURL></CDGroupMember>
    <CDComment>Number sets</CDComment>
    <CDGroupMember>
      <CDName>setname1</CDName>
      <CDURL>http://www.openmath.org/cd/setname1.ocd</CDURL></CDGroupMember>
    <CDComment>Rounding</CDComment>
    <CDGroupMember>
      <CDName>rounding1</CDName>
      <CDURL>http://www.openmath.org/cd/rounding1.ocd</CDURL></CDGroupMember>
    <CDComment>Set-theoretic operators and constructors</CDComment>
    <CDGroupMember>
      <CDName>set1</CDName>
      <CDURL>http://www.openmath.org/cd/set1.ocd</CDURL></CDGroupMember>
    <CDComment>Basic data orientated statistical operators</CDComment>
    <CDGroupMember>
      <CDName>s_data1</CDName>
      <CDURL>http://www.openmath.org/cd/s_data1.ocd</CDURL></CDGroupMember>
    <CDComment>Basic random variable orientated statistical operators</CDComment>
    <CDGroupMember>
      <CDName>s_dist1</CDName>
      <CDURL>http://www.openmath.org/cd/s_dist1.ocd</CDURL></CDGroupMember>
    <CDComment>Basic transcendental functions</CDComment>
    <CDGroupMember>
      <CDName>transc1</CDName>
      <CDURL>http://www.openmath.org/cd/transc1.ocd</CDURL></CDGroupMember>
    <CDComment>Vector calculus functions</CDComment>
    <CDGroupMember>
      <CDName>veccalc1</CDName>
      <CDURL>http://www.openmath.org/cd/veccalc1.ocd</CDURL></CDGroupMember>
    <CDComment>Alternative encoding symbols for compatibility with the MathML
      Semantic mapping constructs.</CDComment>
    <CDGroupMember>
      <CDName>altenc</CDName>
      <CDURL>http://www.openmath.org/cd/altenc.ocd</CDURL></CDGroupMember>
  </CDGroup>]]>
</literallayout>



</section>

<section id="errorcd">
  <title>The <filename>error</filename> Content Dictionary</title>
  
  <literallayout><![CDATA[
  <CD>
    <CDName> error </CDName>
    <CDURL> http://www.openmath.org/cd/error.ocd </CDURL>
    <CDReviewDate> 2003-04-01 </CDReviewDate>
    <CDStatus> official </CDStatus>
    <CDDate> 2001-03-12 </CDDate>
    <CDVersion> 2 </CDVersion>
    <CDRevision> 0 </CDRevision>
    <CDUses>
      <CDName> arith1 </CDName>
      <CDName> specfun1 </CDName>
    </CDUses>
    
    <CDDefinition>
      <Name> unhandled_symbol </Name>
      <Description>
	This symbol represents the error which is raised when an application
	reads a symbol which is present in the mentioned content
	dictionary, but which it has not implemented.
	
	When receiving such a symbol, the application should act as if it had
	received the &OM; error object constructed from unhandled_symbol
	and the unhandled symbol as in the example below.
      </Description>
      
      <Example>
	The application does not implement the Complex numbers:
	<OMOBJ>
	  <OME>
	    <OMS cdbase="http://www.openmath.org/cd" cd="error" name="unhandled_symbol"/>
	    <OMS cdbase="http://www.openmath.org/cd" cd="setname1" name="C"/>
	  </OME>
	</OMOBJ>
      </Example>
    </CDDefinition>
    
    <CDDefinition>
      <Name> unexpected_symbol </Name>
      <Description>
	This symbol represents the error which is raised when an application
	reads a symbol which is not present in the mentioned content dictionary.
	
	When receiving such a symbol, the application should act as if it had
	received the &OM; error object constructed from unexpected_symbol
	and the unexpected symbol as in the example below.
      </Description>
      <Example>
	The application received a mistyped symbol
	<OMOBJ>
	  <OME>
	    <OMS cdbase="http://www.openmath.org/cd" cd="error" name="unexpected_symbol"/>
	    <OMS cdbase="http://www.openmath.org/cd" cd="arith1" name="plurse"/>
	  </OME>
	</OMOBJ>
      </Example>
    </CDDefinition>
    
    <CDDefinition>
      <Name> unsupported_CD </Name>
      <Description>
	This symbol represents the error which is raised when an application
	reads a symbol where the mentioned content dictionary is not
	present.
	
	When receiving such a symbol, the application should act as if it had
	received the &OM; error object constructed from unsupported_CD and
	the symbol from the unsupported Content Dictionary as in the example
	below.
      </Description>
      <Example>
	The application does not know about the CD specfun1
	<OMOBJ>
	  <OME>
	    <OMS cdbase="http://www.openmath.org/cd" cd="error" name="unsupported_CD"/>
	    <OMS cdbase="http://www.openmath.org/cd" cd="specfun1" name="BesselJ"/>
	  </OME>
	</OMOBJ>
      </Example>
    </CDDefinition>
    
  </CD>]]>
</literallayout>

</section>

</appendix>


<appendix id="app_relaxcompact" revisionflag="added">
  <title>&OM; Schema in Relax NG XML Syntax (Non-Normative)</title>
  
  <para>This is the Relax NG Schema described in <xref linkend="sec_xml"/>
    expressed according to the Relax NG XML Syntax.
  </para>
  <literallayout>
    &omrng;
  </literallayout>
</appendix>

<appendix id="app_relaxrestricted" revisionflag="added">
  <title>Restricting the &OM; Schema (Non-Normative)</title>
  
  <para> Relax NG allows one to state constraints such as <emphasis>
if the cd attribute of OMS is arith1 then the name attribute must be
one of lcm, gcd, plus etc.</emphasis> Thus it is easy to use a
stylesheet to generate for any given CD, a Relax NG schema that
expresses the constraint that an <systemitem>OMS</systemitem> naming
that CD must only use symbols defined in the specified dictionary.
Similarly it is possible to use the <emphasis>role</emphasis>
information contained in the CD to restrict which symbols can be the
first child of an <systemitem>OMBIND</systemitem> or the odd-numbered
children of an <systemitem>OMATP</systemitem>. 
</para>

<para> The modularisation mechanisms of Relax NG then allow one to
include these schema for all the CDs that you want to allow and, for
example, to replace the regexp-based validation of the
<systemitem>OMS</systemitem> attributes by explicit lists of allowed
CD names, and for each CD Name, a list of allowed symbol names.
</para>

<para>
For example, a CD-specific Relax NG Schema for the arith1 CD shown in
<xref linkend="arith1.ocd"/> would look like:
<literallayout>
<![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="">
  <define name="cd.attlist.OMS" combine="choice">
    <attribute name="cd">
      <value type="string">arith1</value>
    </attribute>
    <attribute name="name">
      <choice>
        <value type="string">lcm</value>
        <value type="string">gcd</value>
        <value type="string">plus</value>
        <value type="string">unary_minus</value>
        <value type="string">minus</value>
        <value type="string">times</value>
        <value type="string">divide</value>
        <value type="string">power</value>
        <value type="string">abs</value>
        <value type="string">root</value>
        <value type="string">sum</value>
        <value type="string">product</value>
      </choice>
    </attribute>
  </define>
</grammar>]]>
</literallayout>
or, using the Relax NG compact syntax:
<literallayout>
cd.attlist.OMS |= 
  attribute cd {string "arith1" },
  attribute name {
    string "lcm" |
    string "gcd" |
    string "plus" |
    string "unary_minus" |
    string "minus" |
    string "times" |
    string "divide" |
    string "power" |
    string "abs" |
    string "root" |
    string "sum" |
    string "product" }
</literallayout>
</para>

<para> To build a schema that allows only symbols from arith1 we just
need to include the &OM; schema described in <xref
linkend="app_relaxcompact"/>, override the attribute declarations for
OMS, and then include the schema for arith1.  For example:
<literallayout>
<![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
  <include href="openmath.rng">
    <define name="attlist.OMS">
      <ref name="cd.attlist.OMS"/>
    </define>
  </include>
  <include href="arith1.rng"/>
</grammar>]]>
</literallayout>
or, in the compact syntax:
<literallayout>
include "openmath.rnc" {
 attlist.OMS = cd.attlist.OMS}

include "arith1.rnc"
</literallayout>
Using this approach it is possible to include as many files as
required.
</para>

</appendix>

<appendix id="app_xsd" revisionflag="added">
  <title>&OM; Schema in XSD Syntax (Non-Normative)</title>
  
  <para>This is an XSD Schema generated from the Relax NG Schema described in 
        <xref linkend="sec_xml"/>.
  </para>
  <literallayout>
    &omxsd;
  </literallayout>
</appendix>

<appendix id="app_dtd" revisionflag="added">
  <title>&OM; DTD (Non-Normative)</title>
  
  <para>This is a DTD generated from the Relax NG Schema described in 
        <xref linkend="sec_xml"/>.  Note that we cannot express the 
        fact that the <systemitem>OMFOREIGN</systemitem> element can
        contain any well-formed XML, so we have simply restricted it to
        contain any XML defined in the DTD.
  </para>
  <literallayout>
    &omdtd;
  </literallayout>
</appendix>

  <appendix revisionflag="added" id="app_whats_new">
    <title>Changes between &OM; 1.1 and &OM; 2 (Non-Normative)</title>


    <para>In this appendix we describe the major changes that occurred
between version 1.1 and version 2 of the &OM; standard. All changes to
the encodings and content dictionaries have been designed to be
backward compatibile, in other words all existing &OM; objects and
Content Dictionaries are still valid in &OM; 2.  On the other hand an
existing  &OM; 1.1 application may not be able to process &OM; 2
objects.
</para>

    <section>
      <title>Changes to the Formal Definition of Objects</title>
      
      <para>Additional features of abstract objects have been
      introduced:</para>
      <itemizedlist>
	<listitem>
	  <para>&OM; symbols have an optional rôle qualifier which restricts the
	  place where they may occur within compound objects.
Although part of the abstract description of a symbol this information
is intended to be stored in the CD.  In the &exml; encoding it may be
used to provide a more restricted schema leading to tighter
validation.
</para>
	</listitem>
	<listitem>
	  <para>
In addition to their <emphasis>name</emphasis> and
<emphasis>cd</emphasis> properties, symbols now have an optional
<emphasis>cdbase</emphasis> property.  This can be used to
disambiguate between two CDs which are produced independently but have
the same name, and can also be used to produce a canonical URI for any
&OM; symbol for use in frameworks such as RDFS or MathML which
need one.
	  </para>
	</listitem>
	<listitem>
	  <para>&OM; variables can be indexed, in which case they
	  carry information about their enumerator.  Since &OM; only
allows variables and not objects to be bound, it was not possible to
produce indexed variables by defining an appropriate symbol in a CD.
Also, although it would be possible to produce an indexed variable
using the new <emphasis>semantic-attribute</emphasis> role, it was
felt that attributes describe or modify an object, whereas in this
case we were constructing an atomic object.
</para>
	</listitem>
	<listitem>
	  <para>An &OM; object may be attributed with a non-&OM; object
using the new
	  <emphasis>foreign</emphasis>constructor.  This allows an
&exml;-encoded &OM; object to be attributed with appropriate
Presentation MathML, for example, or a base-64 encoded MPEG file of
its aural rendering.
	  </para>
	</listitem>
	<listitem>
	  <para>the new role property can be used to indicate that a
symbol is an <emphasis>attribution</emphasis>, in which case an
application may ignore or remove it, or a <emphasis>semantic
attribution</emphasis> in which case removing it is no longer
guarenteed to produce an equivalent object.  
	  </para>
	</listitem>
	<listitem>
	  <para>restrictions on the names of symbols, variables and
content dictionaries have been relaxed to be compatible with XML and
to be less Anglo-Saxon.
	  </para>
	</listitem>
      </itemizedlist>

    </section>

    <section>
      <title>Changes to the encodings</title>

      <para>The &OM; version 2 standard still mandantes two encodings:
      &exml; and binary. The &exml; encoding in particular has been
      updated to reflect the latest development of &exml; and is now a
full &exml; application.  Version 2
      encodings are backward compatible with version 1.1 encodings.
      </para>
      <itemizedlist>
	<listitem>
	  <para>both encodings have been updated to support the
changes to the model of abstract objects described above.
	  </para>
	</listitem>
	<listitem>
	  <para>encodings support internal and external sharing of
	  objects</para>
	</listitem>
	<listitem>
	  <para>the &exml; encoding in version 2 is defined by a Relax
	  NG schema and the mandated character-based grammar of
	  version 1 has been removed, while the DTD has been relegated
to an Appendix.
	  </para>
	</listitem>
	<listitem>
	  <para>an optional attribute defining the version of the
	  encoding can be specified for the encoded object</para>
	</listitem>
      </itemizedlist>
      

    </section>

    
    <section>
      <title>Changes to Content Dictionaries</title>

      <itemizedlist>
	<listitem>
      <para>In &OM; version 2 Content Dictionaries are defined in
terms of 
	the abstract information content that needs
	to be specified for defining &OM; symbols. The current
	implementation is thus just one possible encoding of this abstract model.
      </para>
	</listitem>
	<listitem>
<para> The <emphasis>CDUses</emphasis> element is not part of this
information model and has been made optional and deprecated in the reference encoding
since it is trivial to extract its content automatically from the CD.
</para>
	</listitem>
	<listitem>
<para>
A CD may now, optionally, define its cdbase.
</para>
	</listitem>
	<listitem>
<para>
A CD symbol definition may now, optionally, define its role.
</para>
	</listitem>
      </itemizedlist>
      
    </section>

  </appendix>


<bibliography id="bibliography">
  <title>Bibliography</title>
  
  <biblioentry id="POSIX" role="book" revisionflag="added">
    <author><othername>IEEE</othername></author>
    <title>Std 1003.1-2001 (Open Group Technical Standard, Issue 6),
Standard for Information Technology-Portable Operating System Interface (POSIX)</title>
    <pubdate>2001</pubdate>
  </biblioentry>
  
  <biblioentry id="IETF2396" role="misc" revisionflag="added">
  <author><othername>IETF</othername></author>
    <title>RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax</title>
    <pubdate>August 1998</pubdate>
  </biblioentry>
  
  <biblioentry id="XSD" role="book" revisionflag="added">
  <author><othername>World Wide Web Consortium</othername></author>
    <title>XSD Schema Parts 1 &amp; 2</title>
    <pubdate>May 2001</pubdate>
  </biblioentry>
  
  <biblioentry id="RELAX-COMPACT" role="book" revisionflag="added">
    <author><othername>OASIS Committee Specification</othername></author>
    <title>RELAX NG Compact Syntax</title>
    <pubdate>November 2002</pubdate>
  </biblioentry>
  
  <biblioentry id="RELAX" role="book" revisionflag="added">
    <author><othername>OASIS Committee Specification</othername></author>
    <title>RELAX NG Specification</title>
    <pubdate>December 2001</pubdate>
  </biblioentry>
  
  <biblioentry id="MAPLE" role="book">
    <author><firstname>B.</firstname> <othername>W.</othername> <surname>Char</surname></author>
    <author><firstname>K.</firstname> <othername>O.</othername> <surname>Geddes</surname></author>
    <author><firstname>G.</firstname> <othername>H.</othername> <surname>Gonnet</surname></author>
    <author><firstname>S.</firstname> <othername>M.</othername> <surname>Watt</surname></author>
    <title>Maple User's Guide</title>
    <pubdate>1985</pubdate>
    <publisher><publishername>WATCOM Publications Limited</publishername></publisher>
    <edition>4th</edition>
    <bibliomisc>http://www.maplesoft.com/home.html</bibliomisc>
  </biblioentry>
  
  <biblioentry id="LIE" role="Book">
    <author><firstname>M.</firstname> <othername>A.</othername> <surname>A. van Leeuwen</surname></author>
    <author><firstname>A.M.</firstname> <surname>Cohen</surname></author>
    <author><firstname>B.</firstname> <surname>Lisser</surname></author>
    <title>LiE: A Package for Lie Group Computations</title>
    <publisher><publishername>CAN, Amsterdam</publishername></publisher>
    <pubdate>1992</pubdate>
    <bibliomisc>http://www.can.nl/SystemsOverview/Special/GroupTheory/LiE/</bibliomisc> 
  </biblioentry>
  
  <biblioentry id="MUPAD" role="book">
    <author><othername>The MuPAD Group (Benno Fuchssteiner et al.)</othername></author>
    <title>MuPAD User's Manual - MuPAD Version 1.2.2</title>
    <publisher><publishername>John Wiley and sons, Chichester, New York</publishername></publisher>
    <edition>first</edition>
    <pubdate>1996</pubdate>
    <pubdate role="month">march</pubdate>
    <isbn>Wiley: 0-471-96716-5, Teubner: 3-519-02114-5</isbn>
    <bibliomisc>http://www.mupad.de</bibliomisc>
    <bibliomisc role="keywords">MuPAD, Help Pages, Language Structure, Parallelism</bibliomisc>
  </biblioentry>
  
  <biblioentry id="NuPRL" role="Book">
    <author><firstname>R.</firstname> <othername>L.</othername> <surname>Constable</surname></author>
    <author><firstname>S.</firstname> <othername>F.</othername> <surname>Allen</surname></author>
    <author><firstname>H.</firstname> <othername>M.</othername> <surname>Bromley</surname></author>
    <author><firstname>W.</firstname> <othername>R.</othername> <surname>Cleaveland</surname></author>
    <author><firstname>J.</firstname> <othername>F.</othername> <surname>Cremer</surname></author>
    <author><firstname></firstname> <othername>R.</othername> <surname>W. Harper</surname></author>
    <author><firstname>D.</firstname> <othername>J.</othername> <surname>Howe</surname></author>
    <author><firstname>T.</firstname> <othername>B.</othername> <surname>Knoblock</surname></author>
    <author><firstname></firstname> <othername>N.</othername> <surname>P. Mendler</surname></author>
    <author><firstname>P.</firstname> <surname>Panangaden</surname></author>
    <author><firstname>J.</firstname> <othername>T.</othername> <surname>Sasaki</surname></author>
    <author><firstname>S.</firstname> <othername>F.</othername> <surname>Smith</surname></author>
    <title>Implementing Mathematics with the Nuprl Proof
      Development System</title> 
    <publisher><publishername>Prentice Hall</publishername></publisher>
    <pubdate>1986</pubdate>
    <bibliomisc>http://simon.cs.cornell.edu/Info/Projects/NuPrl/nuprl.html</bibliomisc> 
  </biblioentry>
  
  
  <biblioentry id="Kent-PDFbook" role="book">
    <author><othername>Kent, Gordon</othername></author>
    <title>Internet Publishing With Acrobat</title>
    <bibliomisc role="year">1996</bibliomisc>
    <publisher><publishername>Adobe Press</publishername></publisher>
  </biblioentry>
  
  
  <biblioentry id="PDF-Reference-Manual" role="book">
    <author><othername>Adobe Systems Incorporated</othername></author>
    <title>Portable Document Format Reference Manual</title>
    <pubdate>1996</pubdate>
    <publisher><publishername>Adobe Systems Incorporated</publishername></publisher>
  </biblioentry>
  
  <biblioentry id="Knuth-TeXBook" role="book">
    <author><othername>Knuth, Donald E.</othername></author>
    <title>The TeXbook</title>
    <pubdate>1992</pubdate>
    <publisher><publishername>Addison-Wesley, Reading, Massachusetts</publishername></publisher>
  </biblioentry>
  
  
  
  <biblioentry id="PPML" role="Manual">
    <title>The Ppml Manual</title>
    <bibliomisc>ftp://babar.inria.fr/pub/croap/Docs/ppml.ps</bibliomisc> 
  </biblioentry>
  
  
  <biblioentry id="COQ" role="Manual">
    <title>The Coq Proof Assistant: The standard library</title>
    <author><othername>Projet Coq</othername></author>
    <edition>version 6.1</edition>
    <bibliomisc>http://www.ens-lyon.fr/LIP/groupes/coq</bibliomisc>
    
  </biblioentry>
  
  
  <biblioentry id="Knuth-MetaFontBook" role="book">
    <author><othername>Knuth, Donald E.</othername></author>
    <title>MetaFont</title>
    <pubdate>1986</pubdate>
    <publisher><publishername>Addison-Wesley, Reading, Massachusetts</publishername></publisher>
  </biblioentry>
  
  
  <biblioentry id="Lamport-LaTeX2eBook" role="book">
    <author><surname>Lamport</surname><firstname>, Leslie</firstname></author>
    <title>LaTeX: A Document Preparation System, (2nd ed.)</title>
    <pubdate>1994</pubdate>
    <publisher><publishername>Addison-Wesley, Reading, Massachusetts</publishername></publisher>
  </biblioentry>
  
  
  <biblioentry id="Spivak-AMSTeXBook" role="book">
    <author><othername>Spivak, M. D.</othername></author>
    <title>The Joy of TeX &#8212; A Gourmet
      Guide to Typesetting with the AmSTeX macro package</title>
    <pubdate>1986</pubdate>
    <publisher><publishername>American Mathematical Society, Providence, Rhode
	Island</publishername></publisher> 
  </biblioentry>
  
  
  
  <biblioentry id="PVM" role="Book">
    <author><firstname>A.</firstname> <surname>Geist</surname></author>
    <author><firstname>A.</firstname> <surname>Beguelin</surname></author>
    <author><firstname>J.</firstname> <surname>Dongarra</surname></author>
    <author><firstname>W.</firstname> <surname>Jiang</surname></author>
    <author><firstname>R.</firstname> <surname>Manchek</surname></author>
    <author><firstname>V.</firstname> <surname>Sunderam</surname></author>
    <title>PVM: Parallel Virtual Machine: A Users' Guide and
      Tutorial for Networked Parallel Computing </title> 
    <publisher><publishername>MIT Press, Scientific and Engineering Computation</publishername></publisher>
    <pubdate>1994</pubdate>
    <editor><othername>Janusz Kowalik</othername></editor>
  </biblioentry>
  
  <biblioentry id="Abbott_98" role="Misc">
    <author><firstname>J.</firstname> <surname>Abbott</surname></author>
    <title>Univariate factorization over the integers</title>
    <pubdate>1998</pubdate>
    <bibliomisc>preprint</bibliomisc>
  </biblioentry>
  
  
  
  
  <biblioentry id="COCOA" role="Manual">
    <title>CoCoA, a system for doing Computations in Commutative Algebra</title>
    <author><firstname>A.</firstname> <surname>Capani</surname></author>
    <author><firstname>G.</firstname> <surname>Niesi</surname></author>
    <author><firstname>L.</firstname> <surname>Robbiano</surname></author>
    <pubdate>1995</pubdate>
    <bibliomisc>ftp://cocoa.dima.unige.it</bibliomisc>
  </biblioentry>
  
  
  
  <biblioentry id="Giovini_Niesi_90" role="InProceedings">
    <author><firstname>A.</firstname> <surname>Giovini</surname></author>
    <author><firstname>G.</firstname> <surname>Niesi</surname></author>
    <title>CoCoA: A user-friendly system for commutative algebra</title>
    <bibliomisc role="number">429</bibliomisc>
    <bibliomisc role="series">Lecture Bibliomiscs in Computer Science</bibliomisc>
    <bibliomisc role="pages">20&#8211;29</bibliomisc>
    <title role="book">Design and Implementation of Symbolic Computation Systems &#8211;
      International Symposium DISCO'90</title>
    <pubdate>1990</pubdate>
    <publisher><publishername>Springer Verlag</publishername></publisher>
    <address>Berlin</address>
  </biblioentry>
  
  <biblioentry id="Dreyfuss" role="Misc">
    <author><firstname>Paul</firstname> <surname>Dreyfuss</surname></author>
    <title>CORBA: THEORY AND PRACTICE </title>
    <bibliomisc>View Source Magazine</bibliomisc>
    <bibliomisc>http://developer.netscape.com/news/viewsource/</bibliomisc>
  </biblioentry>
  
  
  <biblioentry id="CORBA" role="Misc">
    <author><othername>Visigenic</othername></author>
    <title>Distributed Object Computing in the Internet Age </title>
    <bibliomisc>White Paper</bibliomisc>
    <bibliomisc>http://www.visigenic.com/pdf/visibrok.pdf</bibliomisc>
  </biblioentry>
  
  
  <biblioentry id="Li-Ron_97" role="Misc">
    <author><firstname>Yael</firstname> <surname>Li-Ron</surname></author>
    <title>Communicator 4.0 vs. Internet Explorer 4.0: And the Winner Is ...</title>
    <bibliomisc>PC World</bibliomisc>
    <pubdate>1997</pubdate>
    <pubdate role="month">December</pubdate>
    <bibliomisc>http://www.pcworld.com/software/internet_www/articles/dec97/1512p206.html</bibliomisc>  
  </biblioentry>
  
  
  <biblioentry id="cme" role="Misc">
    <author><firstname>P.</firstname> <surname>Chew</surname></author>
    <author><firstname>R.</firstname> <othername>L.</othername> <surname>Constable</surname></author>
    <author><firstname>K.</firstname> <surname>Pingali</surname></author>
    <author><firstname>S.</firstname> <surname>Vavasis</surname></author>
    <author><firstname>R.</firstname> <surname>Zippel</surname></author>
    <title>Collaborative Mathematics Environments</title>
    <bibliomisc>Project Summary</bibliomisc>
  </biblioentry>
  
  <biblioentry id="intro_hol" role="Book">
    <author><firstname>M.J.C.</firstname> <surname>Gordon</surname></author>
    <author><firstname>T.F.</firstname> <surname>Melham</surname></author>
    <title>Introduction to HOL: A theorem proving environment
      for higher order logic</title> 
    <publisher><publishername>Cambridge University Press</publishername></publisher>
    <pubdate>1993</pubdate>
  </biblioentry>
  
  
  
  <biblioentry id="harrison-fais" role="INPROCEEDINGS">
    <author><firstname>John</firstname> <surname>Harrison</surname></author>
    <title>Pure Mathematics in a Mechanized Logic</title>
    <title role="book">Proceedings of the Finnish Artificial Intelligence
      Society Symposium: Logic, Mathematics and the
      Computer</title>
    <editor><othername>Christoffer Gefwert and Pekka Orponen and
	Juoko Sepp&#228;nen</othername></editor>
    <publisher><publishername>Finnish Artificial Intelligence Society</publishername></publisher>
    <bibliomisc role="series">Suomen Teko&#228;lyseuran julkaisuja</bibliomisc>
    <bibliomisc role="volume">14</bibliomisc>
    <pubdate>1996</pubdate>
    <bibliomisc role="pages">153&#8211;169</bibliomisc></biblioentry>
  
  <biblioentry id="harrison-thesis" role="TECHREPORT">
    <author><firstname>John</firstname> <surname>Robert Harrison</surname></author>
    <title>Theorem Proving with the Real Numbers</title>
    <publisher><publishername>University of Cambridge Computer Laboratory</publishername></publisher>
    <address>New Museums Site, Pembroke Street, Cambridge,
      CB2 3QG, UK</address>
    <pubdate>1996</pubdate>
    <bibliomisc role="number">408</bibliomisc>
    <bibliomisc>Author's PhD thesis</bibliomisc>
    <bibliomisc>http://www.cl.cam.ac.uk/users/jrh/papers/thesis.html</bibliomisc>
  </biblioentry>
  
  
  <biblioentry id="Harrison_Thery_94" role="InProceedings">
    <author><firstname>J.</firstname> <surname>Harrison</surname></author>
    <author><firstname>L.</firstname> <surname>Th&#233;ry</surname></author>
    <title>Extending the HOL Theorem Prover with a
      Computer Algebra System to Reason About the Reals</title>
    <editor><othername>J. J. Joyce and C.-J. H. Seger</othername></editor>
    <bibliomisc role="volume">780</bibliomisc>
    <bibliomisc role="series">Lecture Bibliomiscs in Computer Science</bibliomisc>
    <bibliomisc role="pages">174-184</bibliomisc>
    <title role="book">Higher
      Order Logic Theorem Proving and its Applications: 6th
      International Workshop, HUG'93</title>
    <pubdate>1993</pubdate>
    <publisher><publishername>Springer-Verlag</publishername></publisher>
    <address>Vancouver, B.C.</address>
    <pubdate role="month">August 11-13</pubdate>
  </biblioentry>
  
  
  <biblioentry id="Harrison_Thery_93" role="InProceedings">
    <author><firstname>J.</firstname> <surname>Harrison</surname></author>
    <author><firstname>L.</firstname> <surname>Th&#233;ry</surname></author>
    <title>Reasoning About the Reals: the marriage of HOL and
      Maple</title> 
    <editor><othername>A. Voronkov</othername></editor>
    <bibliomisc role="volume">698</bibliomisc>
    <bibliomisc role="series">Lecture Bibliomiscs in Artificial Intelligence</bibliomisc>
    <bibliomisc role="pages">351-353</bibliomisc>
    <title role="book">Logic Programming and Automated
      Reasoning: 4th International Conrerence</title>
    <pubdate>1993</pubdate>
    <publisher><publishername>Springer-Verlag</publishername></publisher>
    <address>St. Petersburg</address></biblioentry>
  
  
  
  <biblioentry id="Ballarin_Homann_Calmet_95" role="InProceedings">
    <author><firstname>C.</firstname> <surname>Ballarin</surname></author>
    <author><firstname>K.</firstname> <surname>Homann</surname></author>
    <author><firstname>J.</firstname> <surname>Calmet</surname></author>
    <title>Theorems and Algorithms: An Interface between
      Isabelle and Maple.</title> 
    <editor><othername>A.H.M. Levelt </othername></editor>
    <bibliomisc role="pages">150-157</bibliomisc>
    <title role="book">Proceedings of International
      Symposium on Symbolic and Algebraic Computation (ISSAC'95)</title>
    <pubdate>1995</pubdate>
    <publisher><publishername>ACM Press</publishername></publisher>
  </biblioentry>
  
  
  <biblioentry id="Calmet_Homann_96" role="InProceedings">
    <author><firstname>Jacques</firstname> <surname>Calmet</surname></author>
    <author><firstname>Karsten</firstname> <surname>Homann</surname></author>
    <title>Classification of Communication and Cooperation
      Mechanisms for Logical and Symbolic Computation
      Systems</title> 
    <editor><othername>F. Baader and K.U. Schulz</othername></editor>
    <bibliomisc role="series">Applied Logic</bibliomisc>
    <title role="book">Proceedings of First International Workshop
      "Frontiers of Combining Systems" (FroCoS'96)</title> 
    <pubdate>1996</pubdate>
    <publisher><publishername>Kluwer</publishername></publisher>
  </biblioentry>
  
  <biblioentry id="OM1.2" role="Misc">
    <author><firstname>S.</firstname> <surname>Buswell</surname></author>
    <author><firstname>S.</firstname> <surname>Dalmas</surname></author>
    <author><firstname>J.</firstname> <surname>Davenport</surname></author>
    <author><firstname>N.</firstname> <surname>Howgrave-Graham</surname></author>
    <title>Emerging Technologies</title>
    <bibliomisc>&OM; WP 1.2 Deliverable</bibliomisc>
    <pubdate>1998</pubdate>
  </biblioentry>
  
  
  
  
  <biblioentry id="Abbott_Leeuwen_Strotmann_98" role="Article">
    <author><firstname>John</firstname> <othername>A.</othername> <surname>Abbott</surname></author>
    <author><firstname>Andr&#233;</firstname> <surname>van Leeuwen</surname></author>
    <author><firstname>A.</firstname> <surname>Strotmann</surname></author>
    <title>&OM;: Communicating Mathematical Information 
      between Co-operating Agents in a Knowledge Network</title>
    <pubdate>1998</pubdate>
    <bibliomisc>http://www.brunel.ac.uk/~hssrjis/issue/index8.html</bibliomisc>
    <bibliomisc role="volume">3/4</bibliomisc>
    <bibliomisc role="journal">Journal of Intelligent Systems</bibliomisc>
    <bibliomisc>Special Issue: "Improving the Design of Intelligent 
      Systems: Outstanding Problems and Some Methods for their Solution."</bibliomisc>
    
  </biblioentry>
  
  <biblioentry id="Robbiano_98" role="InProceedings">
    <author><firstname>L.</firstname> <surname>Robbiano</surname></author>
  <title>Gr&#246;bner Bases and Statistics</title>
  <editor><othername>Bruno Buchberger and Franz Winkler</othername></editor>
  <bibliomisc role="volume">251</bibliomisc>
  <bibliomisc role="series">London Mathematical Society Lecture Bibliomisc Series</bibliomisc>
  <bibliomisc role="pages">179&#8211;204</bibliomisc>
  <title role="book">Gr&#246;bner Bases and Applications</title>
  <pubdate>1998</pubdate>
  <publisher><publishername>Cambridge University Press</publishername></publisher>
</biblioentry>

<biblioentry id="Moller_98" role="InProceedings">
  <author><firstname>H.M.</firstname> <surname>M&#246;ller</surname></author>
  <title>Gr&#246;bner Bases and Numerical Analysis</title>
  <editor><othername>Bruno Buchberger and Franz Winkler</othername></editor>
  <bibliomisc role="volume">251</bibliomisc>
  <bibliomisc role="series">London Mathematical Society Lecture Bibliomisc Series</bibliomisc>
  <bibliomisc role="pages">159&#8211;179</bibliomisc>
  <title role="book">Gr&#246;bner Bases and Applications</title>
  <pubdate>1998</pubdate>
  <publisher><publishername>Cambridge University Press</publishername></publisher>
</biblioentry>

<biblioentry id="Canny_Manocha_93" role="Article">
  <author><firstname>J.F.</firstname> <surname>Canny</surname></author>
  <author><firstname>D.</firstname> <surname>Manocha</surname></author>
  <title>Multipolynomial resultant algorithms</title>
  <bibliomisc role="journal">Journal of Symbolic Computation</bibliomisc>
  <pubdate>1993</pubdate>
  <bibliomisc role="volume">15</bibliomisc>
  <bibliomisc role="pages">99&#8211;122</bibliomisc>
</biblioentry>




<biblioentry id="Arnon_Beach_McIsaac_Waldspurger_88" role="InProceedings">
  <author><firstname>D.</firstname> <surname>Arnon</surname></author>
  <author><firstname>R.</firstname> <surname>McIsaac</surname></author>
  <author><firstname>K.</firstname> <surname>Waldspurger</surname></author>
  <title>CaminoReal: an Interactive Mathematical Bibliomiscbook</title>
  <bibliomisc role="booktitle">International Conference on Electronic Publishing,
		  Document Manipulation and Typography</bibliomisc>
  <pubdate>1988</pubdate>
  <publisher><publishername>Cambridge University Press</publishername></publisher>
  <address>Nice</address>
</biblioentry>

<biblioentry id="Dalmas_Gaetano_Sausse_94a" role="TechReport">
  <author><firstname>S.</firstname> <surname>Dalmas</surname></author>
  <author><firstname>M.</firstname> <surname>Ga&#235;tano</surname></author>
  <author><firstname>A.</firstname> <surname>Sausse</surname></author>
  <title>ASAP: a protocol for symbolic computation systems</title>
  <publisher><publishername>INRIA</publishername></publisher>
  <pubdate>1994</pubdate>
  <bibliomisc role="number">162</bibliomisc>
</biblioentry>

<biblioentry id="Abbott_Dalmas_Dewar_Diaz_Gray_Sheridan_Strotmann_Vorkoetter_96" role="Misc">
  <author><firstname>J.</firstname> <surname>Abbott</surname></author>
  <author><firstname>S.</firstname> <surname>Dalmas</surname></author>
  <author><firstname>M.</firstname> <surname>Dewar</surname></author>
  <author><firstname>A.</firstname> <surname>Diaz</surname></author>
  <author><firstname>S.</firstname> <surname>Gray</surname></author>
  <author><firstname>S.</firstname> <surname>Sheridan</surname></author>
  <author><firstname>A.</firstname> <surname>Strotmann</surname></author>
  <author><firstname>S.</firstname> <surname>Vorkoetter</surname></author>
  <title>Report of the &OM; Communications Committee</title>
  <pubdate>1995</pubdate>
  <pubdate role="month">13 November</pubdate>
</biblioentry>

<biblioentry id="LEGOmanual" role="manual">
  <author><firstname>Z.</firstname> <surname>Luo</surname></author>
  <author><firstname>R.</firstname> <surname>Pollack</surname></author>
  <title>LEGO Proof Development System: User's Manual</title>
  <bibliomisc role="organization">Department of Compter Science, University of Edinburgh</bibliomisc>
  <bibliomisc role="year">1992</bibliomisc>
</biblioentry>

<biblioentry id="luo_thesis" role="PhdThesis"> 
  <author><firstname>Z.</firstname> <surname>Luo</surname></author> 
  <title>An Extended Calculus of Constructions</title> 
  <bibliomisc role="school">Edinburgh University</bibliomisc> 
  <bibliomisc role="year">1990</bibliomisc> 
</biblioentry>


<biblioentry id="Martin_Shand_97" role="TechReport">
  <author><firstname>U.</firstname> <surname>Martin</surname></author>
  <author><firstname>D.</firstname> <surname>Shand</surname></author>
  <title>Investigating some Embedded Verification Techniques
		  for Computer Algebra Tools</title>
  <publisher><publishername>RISC-Linz, Research Institute for Symbolic Computation</publishername></publisher>
  <pubdate>1997</pubdate>
  <bibliomisc role="number">No. 97-20</bibliomisc>
  <address>J. Kepler University, Linz (A)</address>
  <bibliomisc>http://www-theory.dcs.st-and.ac.uk/~ddshand/Papers/pub.html</bibliomisc>
</biblioentry>

<biblioentry id="Barendregt_Barendsen_97" role="Misc">
  <author><firstname>H.</firstname> <surname>Barendregt</surname></author>
  <author><firstname>E.</firstname> <surname>Barendsen</surname></author>
  <title>Efficient Computations in Formal Proofs</title>
  <bibliomisc>To Appear.</bibliomisc>
</biblioentry>

<biblioentry id="CA_industry_93" role="Book">
  <title>Computer Algebra in Industry,</title>
  <publisher><publishername>Wiley Chichester</publishername></publisher>
  <pubdate>1993</pubdate>
  <editor><othername>A. M. Cohen</othername></editor>
  <bibliomisc role="series">Problem Solving in Practice</bibliomisc>
</biblioentry>


<biblioentry id="vrmlspec97" role="unpublished">
  <author><firstname>R.</firstname> <surname>Carey</surname></author>
  <author><firstname>C.</firstname> <surname>Marrin</surname></author>
  <author><firstname>G.</firstname> <surname>Bell</surname></author>
  <title>The Virtual Reality Modelling Language</title>
  <bibliomisc>International Standard ISO/IEC 14772-1:1997</bibliomisc>
  <bibliomisc>http://www.vrml.org/Specifications/VRML97/</bibliomisc>
  <bibliomisc role="year">1997</bibliomisc>
</biblioentry>

<biblioentry id="vrmlarm97" role="book">
  <author><firstname>R.</firstname> <surname>Carey</surname></author>
  <author><firstname>G.</firstname> <surname>Bell</surname></author>
  <title>The Annotated VRML Reference Manual</title>
  <publisher><publishername>Addison-Wesley</publishername></publisher>
  <bibliomisc role="year">1997</bibliomisc>
</biblioentry>

<biblioentry id="eaispec97" role="unpublished">
  <author><firstname>C.</firstname> <surname>Marrin</surname></author>
  <title>External Authoring Interface Reference</title>
  <bibliomisc>Proposal for a VRML 2.0 Informative Annex</bibliomisc>
  <bibliomisc>http://www.vrml.org/WorkingGroups/vrml-eai/ExternalInterface.html</bibliomisc>
  <pubdate>1997</pubdate>
  <pubdate role="month">November</pubdate>
</biblioentry>

<biblioentry id="harrison-form" role="TECHREPORT">
  <author><firstname>John</firstname> <surname>Harrison</surname></author>
  <title>Formalized Mathematics</title>
  <publisher><publishername>Turku Centre for Computer Science (TUCS)</publishername></publisher>
  <address>Lemmink&#228;isenkatu 14 A, FIN-20520 Turku,
                           Finland</address>
  <pubdate>1996</pubdate>
  <bibliomisc role="number">36</bibliomisc>
  <bibliomisc>http://www.cl.cam.ac.uk/users/jrh/papers/form-math3.html</bibliomisc>
</biblioentry>
		  
		  
		  
<biblioentry id="Dunstan_Kelsey_Linton_Martin_98" role="InProceedings">
  <author><firstname>Martin</firstname> <surname>Dunstan</surname></author>
  <author><firstname>Tom</firstname> <surname>Kelsey</surname></author>
  <author><firstname>Steve</firstname> <surname>Linton</surname></author>
  <author><firstname>Ursula</firstname> <surname>Martin</surname></author>
  <title>Lightweight Formal Methods for Computer Algebra Systems</title>
  <title role="book">ISSAC'98: International Symposium on Symbolic and Algebraic Computation</title>
  <pubdate>1998</pubdate>
  <editor><othername>O. Gloor</othername></editor>
  <address>Rostock, Germany</address>
  <pubdate role="month">August</pubdate>
  <publisher><publishername>ACM Press</publishername></publisher>
</biblioentry>

<biblioentry id="Jackson_95" role="PhdThesis">
  <author><firstname>Paul</firstname> <surname>Jackson</surname></author>
  <title>Enhancing the Nuprl Proof Development System and 
Applying it to Computational Abstract Algebra</title>
  <bibliomisc role="school">Cornell University</bibliomisc>
  <pubdate>1995</pubdate>
  <bibliomisc role="series">TR95-1509</bibliomisc>
</biblioentry>

<biblioentry id="Thery_98" role="InProceedings">
  <author><firstname>Laurent</firstname> <surname>Th&#233;ry</surname></author>
  <title>A Certified Version of Buchberger Algorithm</title>
  <title role="book">Automated Deduction - CADE 15: 
15th International Conference on Automated Deduction</title>
  <pubdate>1998</pubdate>
  <editor><othername>C. Kirchner and H. Kirchner</othername></editor>
  <bibliomisc role="volume">1421</bibliomisc>
  <bibliomisc role="series">Lecture Bibliomiscs in Artificial Intelligence</bibliomisc>
  <address>Landau, Germany</address>
  <pubdate role="month">July</pubdate>
  <publisher><publishername>Springer Verlag</publishername></publisher>
</biblioentry>

<biblioentry id="PolyMath_JAVA" role="Misc">
  <author><othername>PolyMath &OM; Development Team</othername></author>
  <title>Java &OM; Library: Version 0.7c</title>
  <bibliomisc>http://pdg.cecm.sfu.ca/openmath/</bibliomisc>
  <pubdate role="month">June</pubdate>
  <pubdate>1999</pubdate>
</biblioentry>

<biblioentry id="STARS" role="Misc">
  <author><firstname>Stephen</firstname> <surname>Buswell</surname></author>
  <title>STARS</title>
  <bibliomisc>Available from Stilo Technologies</bibliomisc>
  <bibliomisc>http://www.stilo.com</bibliomisc>
  <pubdate role="month">April</pubdate>
  <pubdate>1999</pubdate>
</biblioentry>


<biblioentry id="OMurl" role="Misc">
  <author><othername>&OM; Society Website</othername></author>
  <title>www.openmath.org</title>
</biblioentry>

<biblioentry id="Dalmas_Gaetano_Watt_97" role="InProceedings">
  <author><firstname>S.</firstname> <surname>Dalmas</surname></author>
  <author><firstname>M.</firstname> <surname>Ga&#235;tano</surname></author>
  <author><firstname>S.</firstname> <surname>Watt</surname></author>
  <title>An &OM; 1.0 Implementation</title>
  <bibliomisc role="pages">241&#8211;248</bibliomisc>
  <bibliomisc role="booktitle">Proceedings of ISSAC 97</bibliomisc>
  <pubdate>1997</pubdate>
  <publisher><publishername>ACM Press</publishername></publisher>
</biblioentry>

<biblioentry id="OM_96" role="Misc">
  <author><othername>&OM; Steering Committee</othername></author>
  <title>&OM; Version 1.0 released</title>
  <pubdate>1996</pubdate>
  <pubdate role="month">December</pubdate>
  <bibliomisc>http://www.openmath.org</bibliomisc>
</biblioentry>

<biblioentry id="OM_98" role="Misc">
  <author><othername>&OM; Consortium</othername></author>
  <title>&OM; Version 1 - Draft</title>
  <pubdate>1998</pubdate>
  <pubdate role="month">June</pubdate>
  <bibliomisc>ftp://ftp-sop.inria.fr/safir/OM/v1.ps</bibliomisc>
</biblioentry>

		  
		  
		 
<biblioentry id="Gonnet_Seppala_Watt_96" role="Misc">
  <author><firstname>G.</firstname> <surname>Gonnet</surname></author>
  <author><firstname>M.</firstname> <surname>Seppala</surname></author>
  <author><firstname>S.</firstname> <surname>Watt</surname></author>
  <title>Semantic Dictionaries for &OM;</title>
  <bibliomisc>Presented at the 6th &OM; Workshop, Z&#252;rich</bibliomisc>
  <pubdate>1996</pubdate>
  <pubdate role="month">July 27-28</pubdate>
  <bibliomisc>http://www.inf.ethz.ch/personal/gonnet/ContDict.html</bibliomisc>
</biblioentry>

<biblioentry id="Constable_98" role="Misc">
  <author><firstname>Robert</firstname> <surname>Constable</surname></author>
  <bibliomisc>Personal Communication</bibliomisc>
  <pubdate>1998</pubdate>
  <pubdate role="month">July</pubdate>
</biblioentry>

		  
		  
		  
		  
<biblioentry id="Caprotti_Cohen_Elbers_Geuvers_98" role="Misc">
  <author><firstname>O.</firstname> <surname>Caprotti</surname></author>
  <author><firstname>A.</firstname> <othername>M.</othername> <surname>Cohen</surname></author>
  <author><firstname>H.</firstname> <surname>Elbers</surname></author>
  <author><firstname>H.</firstname> <surname>Geuvers</surname></author>
  <title>Connecting &OM; to Formal Math</title>
  <bibliomisc>Calculemus and Types '98</bibliomisc>
  <pubdate>1998</pubdate>
  <pubdate role="month">July</pubdate>
</biblioentry>


<biblioentry id="UNICODE" role="Book">
  <author><othername>Unicode Consortium</othername></author>
  <title>The Unicode Standard: Version <phrase revisionflag="deleted">2.0</phrase><phrase revisionflag="added">4.0</phrase></title>
  <publisher><publishername>Addison-Wesley Developers Press</publishername></publisher>
  <pubdate><phrase revisionflag="deleted">1996</phrase><phrase
revisionflag="added">2003</phrase></pubdate>
</biblioentry>

<biblioentry id="ieee754_85" role="Misc">
  <bibliomisc role="key">ieee</bibliomisc>
  <title>IEEE Standard for binary Floating-Point Arithmetic</title>
  <bibliomisc>ANSI/IEEE Standard 754</bibliomisc>
  <bibliomisc role="year">1985</bibliomisc>
</biblioentry>

<biblioentry id="rfc1642" role="Misc">
  <author><firstname>D.</firstname> <surname>Goldsmith</surname></author>
  <author><firstname>M.</firstname> <surname>Davis</surname></author>
  <title>UTF-7: A Mail Safe Transformation Format of Unicode</title>
  <bibliomisc>RFC: 1642</bibliomisc>
  <pubdate role="month">July</pubdate>
  <pubdate>1994</pubdate>
</biblioentry>

<biblioentry id="rfc1521" role="Misc">
  <author><firstname>N.</firstname> <surname>Borenstein</surname></author>
  <author><firstname>N</firstname> <surname>Freed</surname></author>
  <title>MIME (Multipurpose Internet Mail Extensions) Part One: Mechanism for Specifying and Describing the Format of Internet Message Bodies</title>
  <bibliomisc>RFC: 1521</bibliomisc>
  <pubdate role="month">September</pubdate>
  <pubdate>1993</pubdate>
  <bibliomisc>http://www.math-inf.uni-greifswald.de/~teumer/mime/1521/rfc1521ToC.html</bibliomisc>
</biblioentry>

<biblioentry id="iso646_83" role="Misc">
  <bibliomisc role="key">iso 646</bibliomisc>
  <title>ISO 7-bit coded character set for information interchange</title>
  <bibliomisc>ISO 646:1983</bibliomisc>
  <pubdate>1983</pubdate>
</biblioentry>

<biblioentry id="rfc2152" role="Misc">
  <author><firstname>D.</firstname> <surname>Goldsmith</surname></author>
  <author><firstname>M.</firstname> <surname>Davis</surname></author>
  <title>UTF-7: A Mail Safe Transformation Format of Unicode</title>
  <bibliomisc>RFC: 2152</bibliomisc>
  <pubdate role="month">May</pubdate>
  <pubdate>1997</pubdate>
  <bibliomisc>http://www.cis.ohio-state.edu/htbin/rfc/rfc2152.html</bibliomisc>
</biblioentry>



<biblioentry id="xmlns" role="Misc">
  <author><othername>World Wide Web Consortium</othername></author>
  <title>Namespaces in XML</title>
  <bibliomisc>REC-xml-names-19990114</bibliomisc>
  <pubdate role="month">January</pubdate>
  <pubdate>1999</pubdate>
  <bibliomisc>http://www.w3.org/TR/REC-xml-names</bibliomisc>
</biblioentry>

<biblioentry id="xml" role="Misc">
  <author><othername>World Wide Web Consortium</othername></author>
  <title>Extensible Markup Language XML 1.0</title>
  <bibliomisc>REC-xml-19980210</bibliomisc>
  <pubdate role="month">February</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>http://www.w3.org/TR/REC-xml</bibliomisc>
</biblioentry>


<biblioentry id="xml-stylesheet" role="Misc">
  <author><othername>World Wide Web Consortium</othername></author>
  <title>Associating Style Sheets with XML documents Version 1.0</title>
  <bibliomisc>W3C Recommendation</bibliomisc>
  <pubdate role="month">June</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>http://www.w3.org/TR/xml-stylesheet/</bibliomisc>
</biblioentry>


<biblioentry id="utf8" role="Misc">
  <author><firstname>F.</firstname> <surname>Yergeau</surname></author>
  <title>UTF-8, a transformation format of ISO 10646</title>
  <bibliomisc>RFC 2279</bibliomisc>
  <pubdate role="month">January</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>Alis Technologies</bibliomisc>
</biblioentry>

<biblioentry id="iso9660" role="Misc">
  <author><othername>Technical committee / subcommittee: JTC 1</othername></author>
  <title>ISO 9660:1988 Information processing &#8211; Volume and File Structure of CDROM for Information Interchange</title>
  <bibliomisc>ISO 9660</bibliomisc>
  <pubdate>1988</pubdate>
</biblioentry>

<biblioentry id="OM_D122" role="Misc">
  <author><firstname>S.</firstname> <surname>Buswell</surname></author>
  <author><firstname>S.</firstname> <surname>Dalmas</surname></author>
  <author><firstname>J.</firstname> <surname>Davenport</surname></author>
  <title>&OM; task 1.2: Emerging Technologies</title>
  <bibliomisc>&OM; Deliverable 1.2.2</bibliomisc>
  <pubdate role="month">September</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>Confidential</bibliomisc>
</biblioentry>

<biblioentry id="xml_98" role="Misc">
  <author><othername>World Wide Web Consortium</othername></author>
  <title>Extensible Markup Language (XML) 1.0.</title>
  <bibliomisc>W3C Recommendation REC-xml-19980210</bibliomisc>
  <pubdate role="month">February</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>http://www.w3.org/TR/1998/REC-xml-19980210</bibliomisc>
</biblioentry>

<biblioentry id="OM_D131a" role="Misc">
  <author><othername>&OM; Consortium</othername></author>
  <title>The &OM; Standard</title>
  <bibliomisc>&OM; Deliverable 1.3.1a</bibliomisc>
  <pubdate role="month">September</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>http://www.nag.co.uk/projects/OpenMath.html</bibliomisc>
</biblioentry>

<biblioentry id="OM_D131b" role="Misc">
  <author><firstname>O.</firstname> <surname>Caprotti</surname></author>
  <author><firstname>A.</firstname> <othername>M.</othername> <surname>Cohen</surname></author>
  <title>A Type System for &OM;</title>
  <bibliomisc>&OM; Deliverable 1.3.1b</bibliomisc>
  <pubdate role="month">September</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>http://www.nag.co.uk/projects/OpenMath.html</bibliomisc>
</biblioentry>

<biblioentry id="OM_D132c" role="Misc">
  <author><firstname>J.</firstname> <surname>Davenport</surname></author>
  <title>A Small &OM; Type System</title>
  <bibliomisc>&OM; Deliverable 1.3.2b</bibliomisc>
  <pubdate role="month">April</pubdate>
  <pubdate>1999</pubdate>
  <bibliomisc>http://www.nag.co.uk/projects/OpenMath/omstd/</bibliomisc>
</biblioentry>


<biblioentry id="OMD132a" role="TechReport">
  <author><othername>The &OM; Consortium</othername></author>
  <title>The &OM; Standard</title>
  <publisher><publishername>&OM; Esprit Consortium</publishername></publisher>
  <pubdate>1999</pubdate>
  <bibliomisc role="number">1.3.2a</bibliomisc>
  <bibliomisc>http://www.nag.co.uk/projects/OpenMath.html</bibliomisc>
  <pubdate role="month">February</pubdate>
  <bibliomisc>O. Caprotti and A. M. Cohen Eds.</bibliomisc>
</biblioentry>

<biblioentry id="OMD132b" role="TechReport">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <author><firstname>Arjeh</firstname> <othername>M.</othername> <surname>Cohen</surname></author>
  <title>A Type System for &OM;</title>
  <publisher><publishername>&OM; Esprit Consortium</publishername></publisher>
  <pubdate>1999</pubdate>
  <bibliomisc role="number">1.3.2b</bibliomisc>
  <bibliomisc>http://www.nag.co.uk/projects/OpenMath.html</bibliomisc>
  <pubdate role="month">February</pubdate>
</biblioentry>

<biblioentry id="OM_D133b" role="TechReport">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <author><firstname>Arjeh</firstname> <othername>M.</othername> <surname>Cohen</surname></author>
  <title>Development of Strong &OM;</title>
  <publisher><publishername>&OM; Esprit Consortium</publishername></publisher>
  <pubdate>1999</pubdate>
  <bibliomisc role="number">1.3.3b</bibliomisc>
  <bibliomisc>http://www.nag.co.uk/projects/OpenMath.html</bibliomisc>
  <pubdate role="month">October</pubdate>
</biblioentry>


<biblioentry id="ida" role="Book">
  <author><firstname>A.</firstname> <othername>M.</othername> <surname>Cohen</surname></author>
  <author><firstname></firstname> <othername>H.</othername> <surname>Cuypers</surname></author>
  <author><firstname>H.</firstname> <surname>Sterk</surname></author>
  <title>Algebra Interactive, interactive course material</title>
  <publisher><publishername>SV</publishername></publisher>
  <pubdate>1999</pubdate>
  <bibliomisc role="number">ISBN 3-540-65368-6</bibliomisc>
</biblioentry>

<biblioentry id="CaprottiCohen99" role="Misc">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <author><firstname>Arjeh</firstname> <othername>M.</othername> <surname>Cohen</surname></author>
  <title>Integrating Computational and Deduction Systems Using &OM;</title>
  <bibliomisc>Calculemus'99: Systems for Integrated Computation and Deduction</bibliomisc>
  <pubdate role="month">July 11-12</pubdate>
  <pubdate>1999</pubdate>
  <address>Trento, Italy</address>
</biblioentry>

<biblioentry id="Buchberger_Jebelan_Kriftner_Marin_Tomuta_Vasaru_97" role="InProceedings">
  <author><firstname>B.</firstname> <surname>Buchberger</surname></author>
  <author><firstname>T.</firstname> <surname>Jebelean</surname></author>
  <author><firstname>F.</firstname> <surname>Kriftner</surname></author>
  <author><firstname>M.</firstname> <surname>Marin</surname></author>
  <author><firstname>E.</firstname> <surname>Tomuta</surname></author>
  <author><firstname>D.</firstname> <surname>Vasaru</surname></author>
  <title>A Survey of the Theorema Project</title>
  <title role="book">Proceedings of ISSAC'97</title>
  <pubdate>1997</pubdate>
  <address>Maui, Hawaii</address>
  <pubdate role="month">July</pubdate>
  <publisher><publishername>Association for Computing Machinery</publishername></publisher>
</biblioentry>


<biblioentry id="Clarke_Zhao_92" role="InProceedings">
  <author><firstname>E.</firstname> <surname>Clarke</surname></author>
  <author><firstname>X.</firstname> <surname>Zhao</surname></author>
  <title>Analytica - a theorem prover in Mathematica</title>
  <title role="book">11th Conference on Automated Deduction</title>
  <bibliomisc role="pages">761&#8211;765</bibliomisc>
  <pubdate>1992</pubdate>
  <editor><othername>D. Kapur</othername></editor>
  <bibliomisc role="volume">607</bibliomisc>
  <bibliomisc role="series">Lecture Bibliomiscs in Computer Science</bibliomisc>
  <publisher><publishername>Springer Verlag</publishername></publisher>
</biblioentry>



<biblioentry id="MathML_98" role="Misc">
  <author><firstname>Stephen</firstname> <surname>Buswell</surname></author>
  <author><firstname>Stan</firstname> <surname>Devitt</surname></author>
  <author><firstname>Angel</firstname> <surname>Diaz</surname></author>
  <author><firstname>Nico</firstname> <surname>Poppelier</surname></author>
  <author><firstname>Bruce</firstname> <surname>Smith</surname></author>
  <author><firstname>Neil</firstname> <surname>Soiffer</surname></author>
  <author><firstname>Robert</firstname> <surname>Sutor</surname></author>
  <author><firstname>Stephen</firstname> <surname>Watt</surname></author>
  <title>Mathematical Markup Language (MathML) 1.0 Specification</title>
  <bibliomisc>W3C Recommendation 19980407</bibliomisc>
  <pubdate role="month">April</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>Available at http://www.w3.org/TR/REC-MathML/</bibliomisc>
</biblioentry>




<biblioentry id="MathML_99" role="Misc">
  <author><firstname>Patrick</firstname> <surname>Ion</surname></author>
  <author><firstname>Robert</firstname> <surname>Miner</surname></author>
  <author><firstname>Stephen</firstname> <surname>Buswell</surname></author>
  <author><firstname>Stan</firstname> <surname>Devitt</surname></author>
  <author><firstname>Angel</firstname> <surname>Diaz</surname></author>
  <author><firstname>Nico</firstname> <surname>Poppelier</surname></author>
  <author><firstname>Bruce</firstname> <surname>Smith</surname></author>
  <author><firstname>Neil</firstname> <surname>Soiffer</surname></author>
  <author><firstname>Robert</firstname> <surname>Sutor</surname></author>
  <author><firstname>Stephen</firstname> <surname>Watt</surname></author>
  <title>Mathematical Markup Language (MathML[tm]) 1.01 Specification</title>
  <bibliomisc>REC-MathML-19980407; revised 19990707 </bibliomisc>
  <pubdate role="month">July</pubdate>
  <pubdate>1999</pubdate>
  <bibliomisc>http://www.w3.org/TR/REC-MathML/</bibliomisc>
</biblioentry>


<biblioentry id="MathML_2000" role="Misc" revisionflag="added">
  <author><othername>World Wide Web Consortium</othername></author>
  <title>Mathematical Markup Language (MathML) 2.0 Specification</title>
  <bibliomisc>REC-MathML2-20010221/</bibliomisc>
  <pubdate role="month">February</pubdate>
  <pubdate>2001</pubdate>
  <bibliomisc>Available at http://www.w3.org/TR/REC-MathML2/</bibliomisc>
</biblioentry>

<biblioentry id="CTCOQMATH" role="Manual">
  <title>CtCoqmath</title>
  <bibliomisc role="organization">INRIA</bibliomisc>
  <address>Sophia Antipolis</address>
  <bibliomisc>Available at http://www-sop.inria.fr/croap/CFC/Ctcoqmath.html</bibliomisc>
</biblioentry>



<biblioentry id="Pottier_Thery_98" role="InProceedings">
  <author><firstname>L.</firstname> <surname>Pottier</surname></author>
  <author><firstname>L.</firstname> <surname>Th&#233;ry</surname></author>
  <title>Certifier Computer Algebra</title>
  <title role="book">Calculemus and Types '98</title>
  <address>Eindhoven</address>
  <pubdate role="month">July</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>http://www-sop.inria.fr/croap/CFC/</bibliomisc>
</biblioentry>

<biblioentry id="LAG" role="Manual">
  <title>The Lego Algebra Group</title>
  <bibliomisc>See http://www.cs.man.ac.uk/~petera/LAG/</bibliomisc>
</biblioentry>

<biblioentry id="Bailey_98" role="PhdThesis">
  <author><firstname>Anthony</firstname> <surname>Bailey</surname></author>
  <title>The Machine-Checked Literate Formalisation
                  of Algebra in Type Theory</title>
  <bibliomisc role="school">University of Manchester</bibliomisc>
  <pubdate>January 15th 1998</pubdate>
  <pubdate role="month">January 15</pubdate>
</biblioentry>



<biblioentry id="OMRS" role="Misc">
  <author><othername>Open Mechanized Reasoning System Project</othername></author>
  <bibliomisc>http://www.mrg.dist.unige.it/omrs</bibliomisc>
</biblioentry>


<biblioentry id="Giunchiglia_Pecchiari_Talcott_96" role="InProceedings">
  <author><firstname>Fausto</firstname> <surname>Giunchiglia</surname></author>
  <author><firstname>Paolo</firstname> <surname>Pecchiari</surname></author>
  <author><firstname>Carolyn</firstname> <surname>Talcott</surname></author>
  <title>Reasoning Theories: Towards an Architecture for Open
      Mechanized Reasoning Systems</title>
  <title role="book">"Frontiers of Combining Systems - First International Workshop" (FroCoS'96)</title>
  <bibliomisc role="pages">157-174</bibliomisc>
  <pubdate>1996</pubdate>
  <editor><othername>F. Baader and K.U. Schulz</othername></editor>
  <bibliomisc role="series">Applied Logic Series</bibliomisc>
  <address>Munich, Germany</address>
  <pubdate role="month">26-29 March</pubdate>
  <publisher><publishername>Kluwer</publishername></publisher>
</biblioentry>



<biblioentry id="Bertoli_Calmet_Giunchiglia_Homann_98" role="InProceedings">
  <author><firstname>P.</firstname> <surname>Bertoli</surname></author>
  <author><firstname>J.</firstname> <surname>Calmet</surname></author>
  <author><firstname>F.</firstname> <surname>Giunchiglia</surname></author>
  <author><firstname>K.</firstname> <surname>Homann</surname></author>
  <title>Specification and Integration of Theorem Provers and Computer Algebra Systems</title>
  <title role="book">Artificial Intelligence and Symbolic Computation: International Conference AISC'98</title>
  <pubdate>1998</pubdate>
  <editor><othername>J. Calmet and J. Plaza</othername></editor>
  <bibliomisc role="volume">1476</bibliomisc>
  <bibliomisc role="series">Lecture Notes in Artificial Intelligence</bibliomisc>
  <address>Plattsburgh, New York, USA</address>
  <pubdate role="month">September</pubdate>
</biblioentry>



<biblioentry id="FIPA" role="Misc">
  <author><othername>Foundation for Intellingent Physical Agents</othername></author>
  <bibliomisc>http://www.fipa.org</bibliomisc>
</biblioentry>


<biblioentry id="Franke_Hess_Jung_Kohlhase_Sorge_99" role="Article">
  <author><firstname>A.</firstname> <surname>Franke</surname></author>
  <author><firstname>S.</firstname> <surname>Hess</surname></author>
  <author><firstname>Ch.</firstname> <surname>Jung</surname></author>
  <author><firstname>M.</firstname> <surname>Kohlhase</surname></author>
  <author><firstname>V.</firstname> <surname>Sorge</surname></author>
  <title>Agent-Oriented Integration of Distributed Mathematical Services</title>
  <pubdate>1999</pubdate>
  <bibliomisc role="volume">5</bibliomisc>
  <bibliomisc role="number">3</bibliomisc>
  <bibliomisc role="pages">156&#8211;187</bibliomisc>
  <pubdate role="month">March</pubdate>
  <bibliomisc role="journal">Journal of Universal Computer Science</bibliomisc>
  <bibliomisc>Special issue on Integration of Deduction System</bibliomisc>
  <bibliomisc>http://medoc.springer.de:8000/jucs_5_3/agent_oriented_integration_of;internal&amp;sk=060C4837</bibliomisc>
</biblioentry>

<biblioentry id="Franke_Hess_Jung_Kohlhase_Sorge_98" role="InProceedings">
  <author><firstname>A.</firstname> <surname>Franke</surname></author>
  <author><firstname>S.</firstname> <surname>Hess</surname></author>
  <author><firstname>Ch.</firstname> <surname>Jung</surname></author>
  <author><firstname>M.</firstname> <surname>Kohlhase</surname></author>
  <author><firstname>V.</firstname> <surname>Sorge</surname></author>
  <title>An Implementation of Distributed Mathematical Services</title>
  <title role="book">Calculemus and Types 98</title>
  <pubdate>1998</pubdate>
  <address>Eindhoven</address>
  <pubdate role="month">July</pubdate>
</biblioentry>


<biblioentry id="Bertot_Thery_98" role="Article">
  <author><firstname>Yves</firstname> <surname>Bertot</surname></author>
  <author><firstname>Laurent</firstname> <surname>Th&#233;ry</surname></author>
  <title>A Generic Approach to Building User Interfaces for Theorem Provers</title>
  <bibliomisc role="journal">Journal of Symbolic Computation</bibliomisc>
  <pubdate>1998</pubdate>
  <bibliomisc role="volume">25</bibliomisc>
  <bibliomisc role="pages">161-194</bibliomisc>
</biblioentry>

<biblioentry id="Luo_Callaghan_97" role="InProceedings">
  <author><firstname>Z.</firstname> <surname>Luo</surname></author>
  <author><firstname>P.</firstname> <surname>Callaghan</surname></author>
  <title>Mathematical Vernacular and Conceptual Well-formedness in Mathematical Language</title>
  <title role="book">Proceedings of the 2nd International Conference on Logical Aspects of Computational Linguistics 97</title>
  <pubdate>1997</pubdate>
  <bibliomisc role="volume">1582</bibliomisc>
  <bibliomisc role="series">Lecture Bibliomiscs in Computer Science</bibliomisc>
  <address>Nancy</address>
</biblioentry>



<biblioentry id="Finin_Labrou_Mayfield_97" role="InCollection">
  <author><firstname>Tim</firstname> <surname>Finin</surname></author>
  <author><firstname>Yannis</firstname> <surname>Labrou</surname></author>
  <author><firstname>James</firstname> <surname>Mayfield</surname></author>
  <title>KQML as an agent communication language</title>
  <title role="book">Software Agents</title>
  <publisher><publishername>MIT Press</publishername></publisher>
  <pubdate>1997</pubdate>
  <editor><othername>Jeff Bradshaw</othername></editor>
  <address>Cambridge</address>
</biblioentry>

<biblioentry id="FIPA_99" role="Misc">
  <author><othername>Foundation for Intelligent Physical Agents</othername></author>
  <title>The FIPA '99 Baselines</title>
  <bibliomisc>http://www.fipa.org/spec/fipa99.html</bibliomisc>
</biblioentry>

<biblioentry id="Linton_Solomon_99" role="Misc">
  <author><firstname>Steve</firstname> <surname>Linton</surname></author>
  <author><firstname>Andrew</firstname> <surname>Solomon</surname></author>
  <title>GAP, &OM;, and MCP</title>
  <bibliomisc>ISSAC Workshop: Internet Accessible Mathematical Computation</bibliomisc>
  <pubdate role="month">July</pubdate>
  <pubdate>99</pubdate>
</biblioentry>

<biblioentry id="IAMC" role="TechReport">
  <author><firstname>Paul</firstname> <surname>Wang</surname></author>
  <title>Design and Protocol for Internet Accessible Mathematical Computation</title>
  <publisher><publishername>ICM/Kent State University</publishername></publisher>
  <pubdate>1999</pubdate>
  <bibliomisc role="number">ICM-199901-001</bibliomisc>
  <pubdate role="month">January</pubdate>
</biblioentry>


<biblioentry id="Harvey_99context" role="TechReport">
  <author><firstname>Vilya</firstname> <surname>Harvey</surname></author>
  <title>&OM; in Context</title>
  <publisher><publishername>&OM; Esprit Consortium</publishername></publisher>
  <pubdate>1999</pubdate>
  <bibliomisc>http://www.nag.co.uk/projects/OpenMath/papers/context.pdf</bibliomisc>
  <pubdate role="month">June</pubdate>
</biblioentry>

<biblioentry id="SDMGCHDISCO96" role="InCollection">
  <author><firstname>St&#233;phane</firstname> <surname>Dalmas</surname></author>
  <author><firstname>Marc</firstname> <surname>Ga&#235;tano</surname></author>
  <author><firstname>Claude</firstname> <surname>Huchet</surname></author>
  <title>A Deductive Database for Mathematical formulas</title>
  <title role="book">Design and Implementation of Symbolic Computation Systems</title>
  <publisher><publishername>Springer Verlag</publishername></publisher>
  <editor><othername>Jacques Calmet and Carla Limongelli</othername></editor>
  <bibliomisc role="number">1128</bibliomisc>
  <bibliomisc role="series">LNCS</bibliomisc>
  <bibliomisc role="pages">287-296</bibliomisc>
  <pubdate>1996</pubdate>
</biblioentry>



<biblioentry id="DOM_98" role="Misc">
  <title>Document Object Model (DOM) Level 1 Specification</title>
  <bibliomisc>REC-DOM-Level-1-19981001</bibliomisc>
  <pubdate role="month">October</pubdate>
  <pubdate>1998</pubdate>
  <bibliomisc>http://www.w3.org/TR/REC-DOM-Level-1/</bibliomisc>
  <bibliomisc>W3C Recommendation</bibliomisc>
</biblioentry>



<biblioentry id="XSL_99" role="Misc">
  <author><othername>World Wide Web Consortium</othername></author>
  <title>Extensible Stylesheet Language (XSL) Specification</title>
  <bibliomisc>W3C Working Draft</bibliomisc>
  <pubdate role="month">21 Apr</pubdate>
  <pubdate>1999</pubdate>
  <bibliomisc>http://www.w3.org/TR/WD-xsl/</bibliomisc>
</biblioentry>

<biblioentry id="Kohlhase_99" role="InProceedings">
  <author><firstname>M.</firstname> <surname>Kohlhase</surname></author>
  <title>&OM; for knowledge-based automated theorem proving</title>
  <title role="book">Electronic Proceedings of the 12th &OM; Workshop</title>
  <pubdate>1999</pubdate>
  <address>Eindhoven, Netherlands</address>
  <pubdate role="month">June</pubdate>
  <bibliomisc>http://www.riaca.win.tue.nl/projects/OpenMath/workshop</bibliomisc>
</biblioentry>



<biblioentry id="Cohen_Kohlhase_99om" role="Misc">
  <author><firstname>Arjeh</firstname> <surname>Cohen</surname></author>
  <author><firstname>Michael</firstname> <surname>Kohlhase</surname></author>
  <title>Proposal of an Extension to &OM; by Defining
                  Mathematical Properties</title>
  <bibliomisc>12th &OM; Workshop</bibliomisc>
  <pubdate role="month">June</pubdate>
  <pubdate>1999</pubdate>
  <bibliomisc>http://www.win.tue.nl/~amc/kohlhase.dvi</bibliomisc>
</biblioentry>


<biblioentry id="Caprotti_99CFCa" role="Misc">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <title>&OM;: Accessing and Using Mathematical Information Electronically</title>
  <bibliomisc>CFC meeting talk</bibliomisc>
  <pubdate role="month">May</pubdate>
  <pubdate>1999</pubdate>
  <bibliomisc>Slide presentation available at http://www.riaca.win.tue.nl/~olga/om/CFCom.ps</bibliomisc>
</biblioentry>

<biblioentry id="Caprotti_99CFCb" role="Misc">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <title>&OM; and COQ: Communicating Certified Mathematical Content</title>
  <bibliomisc>CFC meeting talk</bibliomisc>
  <pubdate role="month">May</pubdate>
  <pubdate>1999</pubdate>
  <bibliomisc>http://www.riaca.win.tue.nl/~olga/om/cfcCOCOM.ps</bibliomisc>
</biblioentry>

<biblioentry id="Caprotti_99imacs" role="Misc">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <title>Interfacing CA and Proof Checkers with &OM;</title>
  <bibliomisc>IMACA-ACA 99</bibliomisc>
  <pubdate role="month">June</pubdate>
  <pubdate>1999</pubdate>
</biblioentry>


<biblioentry id="Caprotti_Carlisle_99" role="Article">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <author><firstname>David</firstname> <surname>Carlisle</surname></author>
  <title>&OM; and MathML: Semantic Mark Up for Mathematics</title>
  <bibliomisc role="journal">Crossroad</bibliomisc>
  <pubdate>1999</pubdate>
  <bibliomisc role="volume">Special Issue on Markup Languages</bibliomisc>
  <bibliomisc>http://www.acm.org/crossroads</bibliomisc>
</biblioentry>

<biblioentry id="Caprotti_Cohen_99calc" role="InProceedings">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <author><firstname>Arjeh</firstname> <surname>Cohen</surname></author>
  <title>Integrating Computational and Deduction Systems Using &OM;</title>
  <title role="book">Proceedings of Calculemus 99</title>
  <pubdate>1999</pubdate>
  <address>Trento</address>
  <pubdate role="month">July</pubdate>
</biblioentry>

<biblioentry id="Caprotti_Cohen_99iamc" role="InProceedings">
  <author><firstname>Olga</firstname> <surname>Caprotti</surname></author>
  <author><firstname>Arjeh</firstname> <surname>Cohen</surname></author>
  <title>Interactive Mathematics with Strong &OM;</title>
  <title role="book">Internet Accessible Mathematical Computation</title>
  <pubdate>1999</pubdate>
  <address>Vancouver, Canada</address>
  <pubdate role="month">July 28</pubdate>
  <bibliomisc>http://symbolicnet.mcs.kent.edu/icm/research/iamc99proceedings.html</bibliomisc>
</biblioentry>

<biblioentry id="url_OMsem99" role="Misc">
  <title>Seminar on &OM; for Industry</title>
  <bibliomisc>http://www.riaca.win.tue.nl/projects/OpenMath/convention.html</bibliomisc>
  <pubdate role="month">June</pubdate>
  <pubdate>1999</pubdate>
</biblioentry>

<biblioentry id="url_OMworkshop12" role="Misc">
  <title>12th  &OM; Workshop</title>
  <bibliomisc>http://www.riaca.win.tue.nl/projects/OpenMath/workshop/</bibliomisc>
  <pubdate role="month">June 15-16</pubdate>
  <pubdate>1999</pubdate>
</biblioentry>


</bibliography>
</book>

<!-- LocalWords:  xsl href omstd DocBook docbook olga's dtds customisations sidebar
 LocalWords:  ATTLIST mrow mn mi mo msub msup mtext mspace mfrac mml xmlns exml
 LocalWords:  revisionflag varname systemitem PCDATA mathcolor mathvariant dpc
 LocalWords:  exadigits lcalpha ucalpha regxp zsp longrightarrow varnamechar OC
 LocalWords:  omrnc openmath rnc omxsd xsd omrng rng bookinfo releaseinfo xref
 LocalWords:  firstname Buswell othername Gaetano linkend cha toc formalised cd
 LocalWords:  Leeuwen Strotmann Dalmas omsoc ulink url int fileref obj enco gt
 LocalWords:  addnfiles CDGroup DefMP phrasebooks Phrasebook behaviour omin
 LocalWords:  omabs labelled itemizedlist listitem bignums ieee Unicode mfenced
 LocalWords:  Bytearray -->

