Next: Translation of
Definite Clause Up: Definite Clause
Grammars Previous: Definite Clause
Grammars Contents
Index
Definite
clause grammars (DCGs) are an extension of context free grammars that have
proven useful for describing natural and formal languages, and that may be
conveniently expressed and executed in Prolog. A Definite Clause Grammar rule in
Prolog is executable because it is just a notational variant of a Prolog term
that has the following general form:
Head -> Body.
with the
declarative interpretation that ``a possible form for Head is
Body''. The procedural interpretation of a grammar rule is that it
takes an input list of symbols or character codes, analyses some initial portion
of that list, and produces the remaining portion (possibly enlarged) as output
for further analysis. The arguments required for the input and output lists are
not written explicitly in the DCG rule, but are added when the rule is
translated (expanded) into an ordinary Prolog clause during parsing. By defining
the hook predicate term_expansion/2, the user can specify any desired
transformation to be done as clauses are read by the reader of XSB's parser.
Extra conditions, in the form of explicit Prolog literals or control constructs
such as if-then-elses ( '->'/2) or cuts ( '!'/0), may be included in the
Body of the DCG rule and they work exactly as one would expect.
An overview of the syntax of DCGs supported by XSB is as follows:
- A non-terminal symbol may be any HiLog term other than a variable or a
number. A variable which appears in the body of a rule is equivalent to the
appearance of a call to the built-in predicate phrase/3 as it is
described below.
- A terminal symbol may be any HiLog term. In order to distinguish terminals
from nonterminals, a sequence of one or more terminal symbols
is
written within a grammar rule as a Prolog list [
], with the empty sequence written as the empty list []. The
list of terminals may contain variables but it has to be a proper list, or
else an error message is sent to the standard error stream and the expansion
of the grammar rule that contains this list will fail. If the terminal symbols
are ASCII character codes, they can be written (as elsewhere) as strings.
- Extra conditions, expressed in the form of Prolog predicate calls, can be
included in the body (right-hand side) of a grammar rule by enclosing such
conditions in curly brackets, '
'
and '
'. For example, one can write:
positive_integer(N) -> [N],
integer(N), N > 0
.
8.1
- The left hand side of a DCG rule must consist of a single non-terminal,
possibly followed by a sequence of terminals (which must be written as a
unique Prolog list). Thus in XSB, unlike SB-Prolog version 3.1,
``push-back lists'' are supported.
- The right hand side of a DCG rule may contain alternatives (written using
the usual Prolog's disjunction operator ';' or using the usual BNF
disjunction operator '|'.
- The Prolog control primitives if-then-else ( '->'/2),
nots ( not/1, fail_if/1,
or tnot/1) and cut ( '!'/0) may also be included in
the right hand side of a DCG rule. These symbols need not be enclosed in curly
brackets. 8.2
All other Prolog's control primitives, such as repeat/0, must be
enclosed explicitly within curly brackets if they are not meant to be
interpreted as non-terminal grammar symbols.
Next: Translation of
Definite Clause Up: Definite Clause
Grammars Previous: Definite Clause
Grammars Contents
Index
Baoqiu Cui
2000-04-23