From 06b95f9bd95528bef9da2ac37473f614e4ec8185 Mon Sep 17 00:00:00 2001 From: Michael Kohlhase <michael.kohlhase@fau.de> Date: Sun, 15 Apr 2018 15:23:40 +0200 Subject: [PATCH] draining --- OM18-ole/.gitignore | 14 ++ OM18-ole/argseq.ocd | 59 +++++++++ OM18-ole/ext.rnc | 3 + OM18-ole/omle.rnc | 60 +++++++++ OM18-ole/omseq.ole | 52 ++++++++ OM18-ole/openmath2.rnc | 89 +++++++++++++ OM18-ole/paper.tex | 289 +++++++++++++++++++++++++++++++++++++++++ OM18-ole/schemas.xml | 5 + 8 files changed, 571 insertions(+) create mode 100644 OM18-ole/.gitignore create mode 100644 OM18-ole/argseq.ocd create mode 100644 OM18-ole/ext.rnc create mode 100644 OM18-ole/omle.rnc create mode 100644 OM18-ole/omseq.ole create mode 100644 OM18-ole/openmath2.rnc create mode 100644 OM18-ole/paper.tex create mode 100644 OM18-ole/schemas.xml diff --git a/OM18-ole/.gitignore b/OM18-ole/.gitignore new file mode 100644 index 0000000..30fab50 --- /dev/null +++ b/OM18-ole/.gitignore @@ -0,0 +1,14 @@ +auto +*-blx.bib +*.aux +*.bbl +*.bcf +*.log +*.out +*.run.xml +*.synctex.gz +*.blg +*.sty +*.zip +*.cls +*.bib diff --git a/OM18-ole/argseq.ocd b/OM18-ole/argseq.ocd new file mode 100644 index 0000000..eff1a6f --- /dev/null +++ b/OM18-ole/argseq.ocd @@ -0,0 +1,59 @@ +<CD xmlns="http://www.openmath.org/OpenMathCD"> + <CDComment> + This CD contains a (part of a) specification of argument sequences + for an OpenMath language extension. + </CDComment> + <CDName>argseq</CDName> + <CDBase>http://www.openmath.org/cd</CDBase> + <CDURL>http://www.openmath.org/cd/argseq.ocd </CDURL> + <CDReviewDate>2014-03-01</CDReviewDate> + <CDStatus>experimental</CDStatus> + <CDDate>2013-10-01</CDDate> + <CDVersion>0</CDVersion> + <CDRevision>1</CDRevision> + + <Description> + This CD defines argument sequences for the use in an OpenMaht3 + language extension. + </Description> + <CDDefinition> + <Name>nth</Name> + <Role>application</Role> + <Description> + This symbol represents the sequence selector. The first argument + is a natural number n and the second an argument sequence S. + The argument selector returns the n-th element in S, if it exits. + </Description> + </CDDefinition> + <CDDefinition> + <Name>nats</Name> + <Role>application</Role> + <Description> + Given a natural number n, this symbol returns the sequence of the + first n natural numbers (starting at zero). + </Description> + <CMP> + For any natural numbers n and m with m>n, the n-th component of nats(m) is n + </CMP> + <FMP> + <OMOBJ xmlns="http://www.openmath.org/OpenMath"> + <OMBIND> + <OMS cd="quant1" name="forall"/> + <OMBVAR><OMV name="n"/><OMV name="m"/></OMBVAR> + <OMA> + <OMS cd="logic1" name="implies"/> + <OMA><OMS cd="relation1" name="gt"/><OMV name="m"/><OMV name="n"/></OMA> + <OMA> + <OMS cd="relation1" name="eq"/> + <OMA> + <OMS cd="argseq" name="nth"/> + <OMA><OMS cd="argseq" name="nats"/><OMV name="n"/></OMA> + </OMA> + </OMA> + <OMV name="n"/> + </OMA> + </OMBIND> + </OMOBJ> + </FMP> + </CDDefinition> +</CD> diff --git a/OM18-ole/ext.rnc b/OM18-ole/ext.rnc new file mode 100644 index 0000000..731465e --- /dev/null +++ b/OM18-ole/ext.rnc @@ -0,0 +1,3 @@ + OMNATS = element OMNATS {omel} + OMNTH = element OMNTH {omel,omel} + omel |= OMNTH | OMNATS diff --git a/OM18-ole/omle.rnc b/OM18-ole/omle.rnc new file mode 100644 index 0000000..5cfb514 --- /dev/null +++ b/OM18-ole/omle.rnc @@ -0,0 +1,60 @@ +# ********************************************* +# +# Relax NG Schema for OpenMath Language Extensions +# +# ********************************************* + +default namespace = "http://www.openmath.org/OpenMathCD" + +## we include an encapsulated version of the OpenMath Schema +omelorig = grammar {include "openmath2.rnc" {start=omel}} +## and one we extend with the generated extension (extract from the LED in question) +omelext = grammar{include "openmath2.rnc" {start=omel} include "ext.rnc"} + +## metadata analogous to the one of CDs. +OLEComment = element OLEComment { text } +OLEName = element OLEName { xsd:NCName } +OLEUses = element OLEUses { OLEName* } +OLEURL = element OLEURL { xsd:anyURI } +OLEBase = element OLEBase { xsd:anyURI } +OLEReviewDate = element OLEReviewDate { xsd:date } +OLEDate = element OLEDate { xsd:date } +OLEVersion = element OLEVersion { xsd:nonNegativeInteger } +OLERevision = element OLERevision { xsd:nonNegativeInteger } +OLEStatus = element OLEStatus { "official" | "experimental" | "private" | "obsolete"} + +Description = element Description { text } + +## the top-level element +start = OMLangExt + OMLangExt = + element OMLangExt { + (OLEComment* & Description? & + OLEName & OLEURL? & OLEBase? & + OLEReviewDate? & OLEDate & OLEStatus & + OLEUses? & + OLEVersion & OLERevision), + schemaext, equality, translation} + +name.attrib = attribute name {xsd:NCName}? +exprlist.attribs = name.attrib +exprlist.model = headexp* +exprlist = element exprlist {exprlist.attribs & exprlist.model} + +expr.attribs = name.attrib +expr.model = empty +expr = element expr {expr.attribs & expr.model} + +head.class = exprlist | expr +headexp = grammar {include "openmath2.rnc" {start = omel} + include "ext.rnc" + omel |= parent head.class + omvar |= parent head.class} + +## and now the LED-specific elements +schemaext = element schemaext {text} +equality = element equality {omelext+} +translation = element translation {attribute cd {text},rule+} +rule = element rule {headexp,omelorig} + + diff --git a/OM18-ole/omseq.ole b/OM18-ole/omseq.ole new file mode 100644 index 0000000..6df15ea --- /dev/null +++ b/OM18-ole/omseq.ole @@ -0,0 +1,52 @@ +<OMLangExt xmlns="http://www.openmath.org/OpenMathCD"> + <OLEName>seq</OLEName> + <OLEDate>2014-04-22</OLEDate> + <OLEStatus>experimental</OLEStatus> + <OLEVersion>1</OLEVersion> + <OLERevision>1</OLERevision> + <schemaext> + OMNATS = element OMNATS {omel} + OMNTH = element OMNTH {omel,omel} + omel |= OMNTH | OMNATS + </schemaext> + <equality> + <OMBIND> + <OMS cd="quant1" name="forall"/> + <OMBVAR><OMV name="n"/><OMV name="m"/></OMBVAR> + <OMA> + <OMS cd="logic1" name="implies"/> + <OMA><OMS cd="relation1" name="gt"/><OMV name="m"/><OMV name="n"/></OMA> + <OMA> + <OMS cd="relation1" name="eq"/> + <OMNTH> + <OMI>n</OMI> + <OMNATS><OMI>m</OMI></OMNATS> + </OMNTH> + <OMI>n</OMI> + </OMA> + </OMA> + </OMBIND> + </equality> + <translation cd="argseq"> + <rule> + <OMNTH> + <expr name="n"/> + <exprlist name="seq"> + <expr name="elt"/> + </exprlist> + </OMNTH> + <OMA> + <OMS cd="seqs" name="nth"/> + <render name="n"/> + <iterate name="seq"> + <render name="elt"/> + </iterate> + </OMA> + </rule> + <rule> + <OMNATS><expr name="n"/></OMNATS> + <OMA><OMS cd="seqs" name="nats"/><render name="n"/></OMA> + </rule> + </translation> +</OMLangExt> + diff --git a/OM18-ole/openmath2.rnc b/OM18-ole/openmath2.rnc new file mode 100644 index 0000000..2d07eb1 --- /dev/null +++ b/OM18-ole/openmath2.rnc @@ -0,0 +1,89 @@ +# RELAX NG Schema for OpenMath 2 +# $Id: openmath2.rnc 8959 2011-09-02 06:01:43Z kohlhase $ +# $HeadURL: https://svn.omdoc.org/repos/omdoc/branches/omdoc-1.3/schema/rnc/openmath2.rnc $ +# See the documentation and examples at http://www.openmath.org + +default namespace om = "http://www.openmath.org/OpenMath" + +start = OMOBJ + +# OpenMath object constructor +OMOBJ = element OMOBJ { compound.attributes, + attribute version { xsd:string }?, + omel } + +# Elements which can appear inside an OpenMath object +omel = + OMS | OMV | OMI | OMB | OMSTR | OMF | OMA | OMBIND | OME | OMATTR |OMR + +# things which can be variables +omvar = OMV | attvar + +attvar = element OMATTR { common.attributes,(OMATP , (OMV | attvar))} + + +cdbase = attribute cdbase { xsd:anyURI}? + +# attributes common to all elements +common.attributes = (attribute id { xsd:ID })? + +# attributes common to all elements that construct compount OM objects. +compound.attributes = common.attributes,cdbase + +# symbol +OMS = element OMS { common.attributes, + attribute name {xsd:NCName}, + attribute cd {xsd:NCName}, + cdbase } + +# variable +OMV = element OMV { common.attributes, + attribute name { xsd:NCName} } + +# integer +OMI = element OMI { common.attributes, + xsd:string {pattern = "\s*(-\s?)?[0-9]+(\s[0-9]+)*\s*"}} +# byte array +OMB = element OMB { common.attributes, xsd:base64Binary } + +# string +OMSTR = element OMSTR { common.attributes, text } + +# IEEE floating point number +OMF = element OMF { common.attributes, + ( attribute dec { xsd:double } | + attribute hex { xsd:string {pattern = "[0-9A-F]+"}}) } + +# apply constructor +OMA = element OMA { compound.attributes, omel+ } + +# binding constructor +OMBIND = element OMBIND { compound.attributes, omel, OMBVAR, omel } + +# variables used in binding constructor +OMBVAR = element OMBVAR { common.attributes, omvar+ } + +# error constructor +OME = element OME { common.attributes, OMS, (omel|OMFOREIGN)* } + +# attribution constructor and attribute pair constructor +OMATTR = element OMATTR { compound.attributes, OMATP, omel } + +OMATP = element OMATP { compound.attributes, (OMS, (omel | OMFOREIGN) )+ } + +# foreign constructor +OMFOREIGN = element OMFOREIGN { + compound.attributes, attribute encoding {xsd:string}?, + (omel|notom)* } + +# Any elements not in the om namespace +# (valid om is allowed as a descendant) +notom = + (element * - om:* {attribute * { text }*,(omel|notom)*} + | text) + +# reference constructor +OMR = element OMR { common.attributes, + attribute href { xsd:anyURI } + } + diff --git a/OM18-ole/paper.tex b/OM18-ole/paper.tex new file mode 100644 index 0000000..300362b --- /dev/null +++ b/OM18-ole/paper.tex @@ -0,0 +1,289 @@ +\documentclass{easychair} +\usepackage{doc} +\usepackage{makeidx} + +\usepackage{url,graphicx,wrapfig,subcaption} +\usepackage{amsfonts,amstext} +\usepackage{lstomdoc} +\lstset{language=OpenMath} +\lstset{columns=fullflexible,basicstyle=\sf} +\usepackage{rotating} +\usepackage{paralist,xcolor} +\usepackage{calbf} +\usepackage[hide]{ed} +\usepackage[hyperref=auto,style=alphabetic,isbn=false,backend=bibtex]{biblatex} +%\usepackage{bibtweaks} +\addbibresource{kwarcpubs.bib} +\addbibresource{extpubs.bib} +\addbibresource{kwarccrossrefs.bib} +\addbibresource{extcrossrefs.bib} +\usepackage{stex-logo} +\usepackage{hyperref} +\def\KWARCslides#1{/Users/kohlhase/stc/slides/#1} + +\def\omdoc{OMDoc\xspace} +\def\mathml{MathML\xspace} +\def\openmath{OpenMath\xspace} +\def\defemph{\textbf} +\def\thmo#1#2{\mathsf{#1}\colon\kern-.15em{#2}} + +\title{\openmath Language Extensions} +\titlerunning{\openmath Language Extensions} +\author{Michael Kohlhase} +\institute{Computer Science, Jacobs University\\\url{http://kwarc.info/kohlhase}} +\authorrunning{Michael Kohlhase} + +\begin{document} +\maketitle + +\begin{abstract} + We propose a language extension mechanism for \openmath that will allow us to introduce + new language features (as have been called for by the community) while keeping the + underlying core language intact so that we can maintain compatibility with MathML3 and + the upcoming ISO standard. + We exhibit the mechanism on the example of extending \openmath with sequences and + discuss other language extensions. + + In a nutshell, we propose to establish OpenMath Language Extension Dictionaries (OLEDs) + as an OpenMath extension mechanism akin to Content Dictionaries, but at the language + level. OLEDs have three functions: They a) extend the syntax admissible in the extended + language, b) specify the meaning of the language extensions, and c) specify when two objects + of the extended language are equal. For a) OLEDs use an extension of the OM RelaxNG + schema, for b) a set of OM-represented rewrite rules into the OpenMath2 language, and + for c) a set of terminatig rewrite rules. +\end{abstract} + +\section{Introduction} + +The \openmath society has decided to task a committee to assess the viability of extending +the \openmath2~\cite{BusCapCar:2oms04} standard and bring in all the extension proposals +out there. There are a variety of proposals that involve extending the set of \openmath +objects, e.g. to introduce sequences in~\cite{HKR:sequences:11}. However, the recent +synchronization of \openmath and content \mathml in the \mathml3 +recommendation~\cite{CarlisleEd:MathML3} and its imminent ISO standardization restrict +the possible extensions severely. + +We propose a way to have our cake (minimize extensions to the \openmath objects) and eat +it (get native syntax for often-used mathematical representational idioms). Instead of +extending the \openmath language with a limited set of primitives we propose to extend +\openmath by a syntax extension mechanism much like \openmath CDs constitute an extension +mechanism for the mathematical vocabularies. + +This proposal is similar in spirit to the re-interpretation of the content \mathml format +into a structurally regular core language (``strict content \mathml'') which is +interpreted as \openmath objects and a more extensive language (``full content \mathml'') +whose semantics is given by translation into strict content \mathml. + +In our proposal, \openmath2 is retained as a strict core language, but various +``pragmatic'' language extensions can be introduced via \openmath \textbf{language + extension dictionaries} (LED). The \openmath society adopts and maintains a set of +``standard LEDs'' alongside with the standard CDs. The \openmath3 format is then induced by +the \openmath standard LEDs from the strict core given by the \openmath2 language. Other +entities can standardize other extensions in LED format -- e.g. the Math working group at +W3C could provide LEDs for full content MathML. + +\section{Language Extension Dictionaries} +Language Extension Dictionaries have three functions: to +\begin{compactenum} +\item\label{n:schema} extend the syntax admissible in the extended language, +\item\label{n:trans} specify the meaning of the language extensions, and +\item\label{n:eq} specify when two objects of the extended language are equal. +\end{compactenum} +As the \openmath and \mathml specifications give a RelaxNG schema~\cite{CM:RELAXNG01} for +the syntax, we do the same in the LED. Following the \mathml3 lead we give the semantics of +the ``full language'' by translation into the strict core. Note that the first two +functions are addressed at the user who wants to write meaningful expressions in the +extended format. The third function is only addressed to phrasebook implementors of the +extended objects. + +\section{An Example Language Extension: Argument Sequences} +We now fortify our intuition with a small LED fragment that introduces two extension +elements from~\cite{HKR:sequences:11}. Note that these have been chosen for expository +reasons only, in particular, they do not constitute a concrete extension proposal, that +would be based on~\cite{HKR:flexary:14}. + +\subsection{Example A Language Extension Dictionary for Sequences}\label{sec:omseq:led} + +\lstinputlisting[caption=A LED for sequences,label=lst:ledseq]{omseq.ole} + +The \lstinline|OMLangExt|\footnote{Note that the names of LED elements have been chosen + more or less randomly and should be carefully re-considered before this turns note into + a standards extension proposal.} element is the top-level element of language +definitions. It contains metadata that is isomorphic to that of \openmath CDS and three +children for the three functions mentioned above. + +\subsubsection{The Schema Extension} + +The \lstinline|schemaext| contains contains RelaxNG rules in compact form that extend the +\openmath2 schema. In our example, the language of \openmath objects is extended by two +new constructs: +\begin{compactitem} +\item the sequence constructor \lstinline|OMNATS| that (given a natural number $n$) + represents the sequence of the first $n$ natural numbers starting at zero. +\item the sequence selector \lstinline|OMNTH| takes an \openmath object representing a + natural number $n$ and a sequence $S$ as arguments and represents the + $n$\textsuperscript{th} element of $S$ (if it exists). +\end{compactitem} +Correspondingly, the \lstinline|schemaExt| element contains a rule for both of the +elements, an extension of the \openmath expressions by \lstinline|OMNTH| elements and a +new syntactic category \lstinline|omseq| that contains \lstinline|OMNATS| elements. From +the LED in Listing~\ref{lst:ledseq}, we can generate RelaxNG schema for the extended +language in Figure~\ref{fig:omobj+seq}. + +We probably need to have an extension for OMCDs as well. Maybe we can use a dynamic +extension mechanism, where an OMOBJ specifies what extensions it uses in a special +attribute, which lists the extensions it uses. If we have a list of LEDs supported by OM, +then we can probably compile such a RelaxNG schema from them. + +\begin{figure}[ht]\centering\lstset{aboveskip=0pt,belowskip=0pt} +\begin{lstlisting}[language=RNC] +input "openmath2.rnc" +OMNATS = element OMNATS {omel} +OMNTH = element OMNTH {omel,omseq} +omseq = OMNATS +omel |= OMNTH +\end{lstlisting}%| +\caption{The RelaxNG Schema \lstinline|omobj+seq|.}\label{fig:omobj+seq} +\end{figure} + +\subsubsection{Equality} +\def\nth{\text{nth}} \def\nats{\text{nats}} + +The \lstinline|equality| element contains equality rules that say when two elements in the +extended language are equal expressed as \openmath elements. Here, we have the relation: +\begin{equation}\label{nthnats} +\forall n.n>m \Rightarrow \nth(\nats(n)) = n +\end{equation} + +\ednote{MK: we have to think about this, maybe we can get by by importing equality + from the corresponding CD.} + +\subsubsection{Translation to \openmath2} +And finally, the \lstinline|translation| element contains rules that allow to translate +objects from the extended language into core \openmath2 objects. + +We propose the OMDoc presentation rewriting for translation since it is relatively +restricted and declarative here. But arguably having XSLT for translation would be more +standards-conformant and more powerful -- which might or might not be a good thing. In +principle any translation mechanism would work, the concrete choice of a mechanism is an +open design choice. The XSLT for our example is in Figure~\ref{fig:olexslt}. + +The \lstinline|translation| element gives objects in the extended language their meaning +by translation into strict \openmath2 (with a special content dictionary +\lstinline|argseq| specified in the \lstinline|cd| attribute of the +\lstinline|translation| element\footnote{We probably need to allow multiple CDs here, + since we may need combinations. Unfortunately, we do not have inheritance in CDs, so we + need more. But on the other hand, the whole attribute is unnecessary, since we can just + pick up the necessary CDs from the translation objects themselves.}; see +Listing~\ref{lst:ledocd}). + +\begin{figure}[ht]\centering\lstset{aboveskip=0pt,belowskip=0pt} +\begin{subfigure}{6.5cm} +\begin{lstlisting} +<OMNTH> + <OMA> + <OMS cd="arith1" name="plus"/> + <OMI>1</OMI> + <OMI>2</OMI> + </OMA> + <OMNATS><OMI>7</OMI></OMNATS> +</OMNTH> +\end{lstlisting} +\caption{A \openmath object with Sequences}\label{fig:omseq-src} +\end{subfigure}\qquad +\begin{subfigure}{7cm} +\begin{lstlisting} +<OMA> + <OMS cd="argseq" name="nth"/> + <OMA> + <OMS cd="arith1" name="plus"/> + <OMI>1</OMI> + <OMI>2</OMI> + </OMA> + <OMA> + <OMA> + <OMS cd="argseq" name="omnats"/> + <OMI>7</OMI> + </OMA> +</OMA> +\end{lstlisting} +\caption{Its Translation}\label{fig:omseq-trans} +\end{subfigure} +\caption{Translating Extended \openmath Expressions}\label{fig:omseq} +\end{figure} + +With the LED from Listing~\ref{lst:ledseq} we can express \openmath objects like the one +in Figure~\ref{fig:omseq-src} with the new \openmath elements licensed by the language +definition: The sequence selector \lstinline|OMNTH| expects an openmath object (denoting a +natural number) as the first child and a sequence as the second. The latter is represented +by the \lstinline|OMNATS| element that represents the sequence of the first seven natural +numbers. + +\begin{figure} +\begin{lstlisting} +<xsl:template match="om:OMNTH"> + <om:OMA> + <OMS cd="argseq" name="nth"/> + <xsl:apply-templates/> + </om:OMA> +</xsl:template> +<xsl:template match="om:OMNATS"> + <om:OMA> + <OMS cd="argseq" name="nth"/> + <xsl:apply-templates/> + </om:OMA> +</xsl:template> +\end{lstlisting} +\caption{An XSLT alternative to pattern-based translation}\label{fig:olexslt} +\end{figure} +\subsection{The Corresponding CD}\label{sec:omseq:cd} + +The translation in the LED above uses special symbols from the \lstinline|argseq| CD, +which we give in Listing~\ref{lst:ledocd}. The CD introduces two symbols \lstinline|nth| +and \lstinline|nats|\ednote{MK: maybe it should also introduce the set of sequences, which + corresponds to the new schema class?}. Note that a full development of argument +sequences would contain more symbols and relations. + +The \lstinline|CMP| and \lstinline|FMP| elements state mathematical properties that +specify the relations between the symbols, here the strict \openmath variant of +\ref{nthnats}\footnote{Here it would be good to have an \lstinline|id| attribute on the + \lstinline|FMP|, so that we can reference it in the LED as a justification.} + + \lstinputlisting[caption=The CD for the LED in \ref{lst:ledseq}, +language=omCD,label=lst:ledocd]{argseq.ocd} + +\section{Conclusion} + +We have sketched an extension mechanism for \openmath that allows to interpret pragmatic +extensions in terms of a core language using specific CDs. That would allow use to obtain +\openmath3 as a collection of language extensions while retaining \openmath2 as a strict +core language -- which is important, since it is referenced as a semantic basis of +\mathml3~\cite{CarlisleEd:MathML3}. The language extension mechanism might be interesting +as a tool for formally recast the full \mathml3 language as a collection of extensions to +strict content \mathml. This would be a nice test case for the extension mechanisms +expressivity. + +\printbibliography + +\begin{appendix} +\section{A RelaxNG Schema for LEDs} +Here we have a RelaxNG schema for LEDs, note that OLEs are self-referential in the sense +that they already contain the language extensions they introduce, so we have to include a +sub-schema \lstinline|ext.rnc| that is the contents oft he \lstinline|schemaext| +element. But with this little trick, we can validate quite nicely. +\lstinputlisting[caption=The CD for the LED in \ref{lst:ledseq}, +language=RNC,label=lst:omle]{omle.rnc} +\end{appendix} +\end{document} +%%% Local Variables: +%%% mode: LaTeX +%%% TeX-master: t +%%% End: + + +% LocalWords: maketitle mathml mathml3 printbibliography LDs eq lst ldseq th 2oms04 nats +% LocalWords: lstinputlisting omseq.ole schemaext ednote compactitem omseq seq nats omCD +% LocalWords: textsuperscript argseq centering lstset aboveskip belowskip omel nthnats +% LocalWords: lstlisting arith1 qquad omnats ldocd argseq.ocd RELAXNG01 textbf ext.rnc +% LocalWords: ledseq omobj openmath2.rnc ledocd forall Rightarrow compactenum omle +% LocalWords: subsubsection omle.rnc diff --git a/OM18-ole/schemas.xml b/OM18-ole/schemas.xml new file mode 100644 index 0000000..1d9ad21 --- /dev/null +++ b/OM18-ole/schemas.xml @@ -0,0 +1,5 @@ +<?xml version="1.0"?> +<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0"> + <uri resource="argseq.ocd" uri="../../../vc/svn/omdoc.org/omdoc/branches/omdoc-1.3/schema/rnc/omcd2.rnc"/> + <uri resource="omseq.ole" uri="omle.rnc"/> +</locatingRules> -- GitLab