NUM:
<two> ==
<one> == one.
In this example, NUM:<one> has the value one,
NUM:<two> has the empty sequence as its value, and
NUM:<three> is simply undefined.
Descriptors are defined recursively, and come in seven kinds.
The simplest descriptor is just an atom or variable:
atom1
$var1
Then there are three kinds of local inheritance descriptor: a node, an (evaluable) path, and a node/path pair. Nodes are primitive tokens, paths are descriptor sequences (defined below) enclosed in angle brackets and node/path pairs consist of a node and a path separated by a colon:
Node1
<desc1 desc2 desc3 ...>
Node1:<desc1 desc2 desc3 ...>
Finally there are three kinds of global inheritance descriptor, which are quoted variants of the three local types just described:
"Node1"
"<desc1 desc2 desc3 ...>"
"Node1:<desc1 desc2 desc3 ...>"
A descriptor sequence is a (possibly empty) sequence of descriptors. A descriptor containing an evaluable path may include nested descriptors which are either local or global. Our use of the local/global terminology always refers to the outermost descriptor of an expression. The recursive definition of evaluable paths in terms of descriptor sequences allows arbitrarily complex expressions to be constructed, such as:
"Node1:<"<atom1>" Node2:<atom2>>"
"<"<"<Node1:<atom1 atom2> atom3>" Node2 "<atom4 atom5>" <> >">"
But the value sequences determined by such definitions are flat: they
have no structure beyond the simple sequence and in particular do not
reflect the structure of the descriptors that define them.
We shall sometimes refer to descriptor sequences containing only atoms as simple values, and similarly (unquoted) path expressions containing only atoms as simple paths.
