/** \page design Implemented Design Specifications
*
* This page details specifications that were once on
* <a href='http://lurch.wiki.sourceforge.net'>the Lurch wiki</a>,
* during the time they were being hashed out
* and discussed, but now have become solidified and implemented in the codebase.
* Thus these specifications are now listed below as a helpful overview of the
* Lurch system's innards.
*
* <h1>Preliminary Definitions</h1>
*
* An OpenMath object is defined in Section 2 of
* <a href='http://www.openmath.org/standard/om20-2004-06-30/'>the OpenMath Standard
* version 2.0</a>.
* It is implemented in
* <a href='http://www.openmath.org/software/index.html'>several libraries that
* can be found on the OpenMath website</a>, the one of interest to us being
* the INRIA's C++ OpenMath library
* (<a href='http://www.openmath.org/software/OMCPPv1.0a.tgz'>click to start download</a>).
* A copy of
* <a href='http://lurch.sourceforge.net/omcppdoc'>its documentation is on our site</a>,
* including
* <a href='http://lurch.sourceforge.net/omcppdoc/OmNode.html'>the page documenting the
* OmNode class, which embodies OpenMath objects</a>.
*
* Lurch makes extensive use of OpenMath attributes, which makes our
* representation consistent and transparent, and makes saving/loading any of our
* objects a trivial consequence of the fact that they are all OpenMath objects,
* and makes us immediately conformant with the OpenMath standard.
* \link attrs This page\endlink
* lists special attributes that are used by Lurch.
*
* A <b>Lurch Object</b> (Lob for short)
* is a wrapper for an OpenMath object, providing several
* conveniences and one necessity:
* <ul>
* <li>(the necessity)<br>
* It exposes all essential functionality of the OpenMath object
* it wraps to the QtScript scripting system discussed below.</li>
* <li>(the conveniences)<br>
* It provides easy interface between the OpenMath library and
* Qt data structures (such as QFile, QDataStream, QString, etc.) with several
* convenience functions, provides mechanisms for dealing with unique IDs,
* and gives methods for creating new Lurch Objects.</li>
* </ul>
* This class is implemented as a wrapper, an object that contains a pointer
* to an OpenMath object. Scripts can create and destroy Lurch Objects
* without damaging the internal structures, which may be owned by other functions.
* We usually refer to these as Lobs.
*
* <h1>Central Definitions</h1>
*
* A <b>Lurch Document</b> is a Lurch Object that wraps an OpenMath object with no
* parent and several useful attributes. It is no longer necessary to enumerate
* them here; the Lob::isDocument() function's documentation already lists them.
*
* We may refer to these as just documents, when context makes it clear that we
* mean Lurch Documents.
*
* Because one document may depend on others, a document designed to be depended
* on by others may sometimes be called a Lurch Library, or just a library,
* due to influence from computer science parlance. We also call them dependencies.
*
* We uniquely identify Lurch Documents by a title-author-version triple,
* which we can encode in a Uniform Resource Names in the publicid namespace.
* See the documentation for Lob::getURN() for details.
* The URN functionality in Lobs right now does not conform to all the
* grueling details on URNs and the publicid namespace on the
* <a href='http://www.ietf.org/rfc/rfc3151.txt'>Internet Engineering Task Force web page</a>,
* but it could easily be made to.
*
* A <b>Lurch Environment</b> can load documents from disk, and when doing so also loads
* all their dependencies, and provides a script environment to use for reading/writing the
* document and reading its dependencies. This is the point at which OpenMath
* (unambiguous semantics) meets reasoning (in the form of arbitrary script code) in Lurch.
*
* A <b>Lurch Function</b> is a Lob that contains code that can be executed in a Lurch
* Environment for avrious purposes. Lurch Environments are defined below. There are
* methods in the Lob class for detecting whether a Lob is a Lurch Function; see
* Lob::isScript() and its friends.
*
* A <b>Lurch Package</b> is a built-in set of tools that appear to a LurchEnvironment as
* a virtual document, and that can be used as a dependency by any document. But the
* routines they provide may be implemented in native code (for speed and access to
* faster/better data structures) or in script code (if that is more convenient).
* See the LurchPackage class and its list of subclasses to see what packages are already
* built into Lurch.
*
* A <b>Lurch Reference</b> is a Lob that is to be interpreted as a reference to a different
* Lob. It can be one of two types. An ID Reference contains the ID of the
* Lob to which it refers; these types of references are used to refer from one point in a
* document to another, not to refer, say, to a point in a dependency document.
* A Nickname Reference contains the nickname of the Lob to which it refers; important Lobs
* like theorems, axioms, rules, equations, etc., have nicknames, which are guaranteed to be
* unique even across dependency relationships. (Lurch Environments guarantee this; they
* will not load a document that has nickname conflicts internally or with dependencies.)
* For more information, see Lob::isIDReference(), Lob::isNicknameReference(), and related
* methods.
*
* <h1>Unimplemented Specifications</h1>
*
* Read those aspects of Lurch that remain unbuilt on
* <a href='http://lurch.wiki.sourceforge.net/Foundational+Specification'>the
* appropriate page from the Lurch wiki</a>.
*/