ALE also provides an infinite collection of atoms. These are of the form:
a_ Termwhere Term is a prolog term. Two a_/1 atoms subsume each other if and only if their terms subsume each other as prolog terms. As a result, no two different, ground atoms subsume each other; and the most general atom of this collection is a_ _. They implicitly exist in every type hierarchy, with a_ _ being immediately subsumed by bot, and with every ground atom being maximal. a_/1 atoms are extensional; and non-ground a_/1 atoms are extensionally identical as Prolog terms, i.e., if they have the same variables in the same positions. For example, a_ f(X) and a_ g(X) are not taken to be the same atom, nor are a_ f(X) and a_ f(f(X), nor are a_ f(X) and a_ f(Y). But a_ f(X) and a_ f(X) are. Their status in the type hierarchy should not be explicitly declared, nor should the fact that they bear no features, nor should their extensionality.
Some care must be exercised when using non-ground atoms in chart edges. ALE's chart parser copies edges, including the Prolog variables inside a_/1 atoms. When these variables are copied, identity among variables within a single edge is preserved, but identity among variables between different edges may be lost. Because ALE delays the enforcement of extensional type checking, this could result in ALE losing a path equation between two atoms. The best way to avoid this is always to use ground atoms in chart edges. Otherwise, the user should at least avoid relying on extensional identity when writing grammars by not using the ALE built-in @= or inequations between non-ground atoms from different edges.
If the user requires intensional atoms, they must be explicitly declared. There must also be no user-defined type, a_, in the type hierarchy. Certain arguments to a_/1 cannot be used, such as a_ itself, and other prolog reserved words, such as mod, unless they are used with the proper operator precedence and proper number of arguments to be parsed by Prolog.
Otherwise, a_/1 atoms can be used wherever a normal type can. They are particularly useful as members of large domains that are too tedious to define, such as phonology attributes in natural language grammars, or to pass extra-logical information around a parse tree, such as numbers representing probabilities. To declare a feature's value as any a_/1 atom, use a_ _:
sign intro [phon:(a_ _)].The parentheses are recommended for readability, but not necessary. Because subsumption among a_/1 atoms mirrors subsumption as prolog terms, one can also declare features appropriate for only certain kinds of atoms. For example:
sign intro [phon:(a_ phon(_))].declares PHON appropriate to any atom whose term's functor is phon/1.
Structure-sharing between a_/1 prolog terms in feature appropriateness declarations is ignored by ALE. For example, the declaration:
foo intro [f:(a_ X),g:(a_ X)].is treated as:
foo intro [f:(a_ _),g:(a_ _)].ALE does respect structure-sharing between a_/1 prolog terms in descriptions.