1709 lines
64 KiB
Plaintext
1709 lines
64 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Research Report 01-0023
|
||
|
||
Artificial Intelligence Programs
|
||
|
||
The University of Georgia
|
||
|
||
Athens, Georgia 30602
|
||
|
||
|
||
Available by ftp from
|
||
|
||
aisun1.ai.uga.edu
|
||
|
||
(128.192.12.9)
|
||
|
||
|
||
Series editor:
|
||
|
||
Michael Covington
|
||
|
||
mcovingt@aisun1.ai.uga.edu
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
1
|
||
|
||
|
||
|
||
|
||
|
||
An Implementation of
|
||
|
||
Discourse Representation Theory
|
||
|
||
|
||
Michael A. Covington
|
||
|
||
Nora Schmitz
|
||
|
||
|
||
Advanced Computational Methods Center
|
||
|
||
University of Georgia
|
||
|
||
Athens, Georgia 30602
|
||
|
||
|
||
April 1988
|
||
|
||
Minor corrections May 1989
|
||
|
||
|
||
ABSTRACT: This paper documents a computer program that
|
||
|
||
constructs discourse representation structures (DRSes)
|
||
|
||
from ordinary English input. A source listing of the
|
||
|
||
program is included. This program is a much extended
|
||
|
||
version of the one developed by Johnson and Klein
|
||
|
||
(1986) and was built to serve as a basis for other
|
||
|
||
research. It is implemented in Prolog using GULP, a
|
||
|
||
locally developed system for translating feature-
|
||
|
||
structure notation into Prolog terms. The reader of
|
||
|
||
this paper is expected to be familiar with discourse
|
||
|
||
representation theory, Prolog, and GULP.
|
||
|
||
|
||
|
||
1. Introduction
|
||
|
||
|
||
This paper briefly documents an implementation of discourse
|
||
|
||
representation theory (DRT) that was built to serve as a
|
||
|
||
foundation for further research. The reader is assumed to be
|
||
|
||
familiar with DRT (Kamp 1981, Spencer-Smith 1987, Guenthner
|
||
|
||
1987), with Prolog, and with the extension of Prolog known as
|
||
|
||
GULP (Covington 1987).1
|
||
|
||
|
||
The implementation relies on a top-down parser written in
|
||
|
||
definite clause grammar (DCG) notation. The parser incorporates a
|
||
|
||
unification-based grammar that builds discourse representation
|
||
|
||
structures (DRSes). These have the form
|
||
|
||
|
||
drs([X1,X2,X3...],[C1,C2,C3...])
|
||
|
||
|
||
|
||
|
||
|
||
|
||
1 This work was supported by National Science Foundation
|
||
|
||
Grant Number IST-85-02477. Opinions and conclusions expressed
|
||
|
||
here are solely those of the authors. We thank Donald Nute, David
|
||
|
||
Goodman, and Marvin Belzer for suggestions.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
where X1, X2, X3... are discourse markers (entities) and C1, C2,
|
||
|
||
C3... are conditions (predications). The entities are
|
||
|
||
represented by integers. Thus the sentence
|
||
|
||
|
||
A farmer owns a donkey.
|
||
|
||
|
||
is translated into a DRS such as
|
||
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
|
||
<20> 1 2 <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
|
||
<20> farmer(1) <20>
|
||
|
||
<20> gender(1,m) <20>
|
||
|
||
<20> donkey(2) <20>
|
||
|
||
<20> gender(2,n) <20>
|
||
|
||
<20> owns(1,2) <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
which is represented in this system as
|
||
|
||
|
||
drs([1,2],[farmer(1),gender(1,m),donkey(2),gender(2,n),
|
||
|
||
owns(1,2)].
|
||
|
||
|
||
(The gender information for farmer and donkey is looked up in a
|
||
|
||
table; this will be discussed below.)
|
||
|
||
|
||
Note that in the originally created DRS, the discourse markers
|
||
|
||
and conditions appear in the opposite of the order in which they
|
||
|
||
are encountered in the discourse; this does not affect the truth
|
||
|
||
conditions. A utility predicate, display_drs, is provided which
|
||
|
||
undoes this reversal and displays the final DRSes in a neat
|
||
|
||
indented format with all their elements occurring in the same
|
||
|
||
order as in the original discourse.
|
||
|
||
|
||
|
||
2. Parsing
|
||
|
||
|
||
2.1. Basic syntax
|
||
|
||
|
||
The syntax accepted by the parser is briefly summarized by the
|
||
|
||
following PS-rules:
|
||
|
||
|
||
discourse --> (statement ; question), endpunct, discourse.
|
||
|
||
discourse --> [].
|
||
|
||
|
||
endpunct --> ['.'];['?'];['!'].
|
||
|
||
|
||
question --> [does], np, vp.
|
||
|
||
question --> [is], np, adj.
|
||
|
||
question --> [is], np, np.
|
||
|
||
|
||
statement --> s.
|
||
|
||
|
||
2
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
3
|
||
|
||
|
||
s --> np, vp.
|
||
|
||
s --> np, [does,not], vp.
|
||
|
||
s --> np, [is], adj.
|
||
|
||
s --> np, [is,not], adj.
|
||
|
||
s --> np, [is], np.
|
||
|
||
s --> np, [is,not], np.
|
||
|
||
s --> [if], s, [then], s.
|
||
|
||
|
||
np -->
|
||
|
||
np --> n(class:proper).
|
||
|
||
np --> det, n2.
|
||
|
||
np --> [he]; [him]; [she]; [her]; [it].
|
||
|
||
|
||
n1 --> n(class:common).
|
||
|
||
n1 --> adj, n1.
|
||
|
||
|
||
n2 --> n1.
|
||
|
||
n2 --> n1, relcl.
|
||
|
||
|
||
relcl --> ([who]; [whom]; [which]; [that]), s.
|
||
|
||
|
||
|
||
det --> [a]; [an]; [every]; [no]; [not,every].
|
||
|
||
|
||
vp --> v, np.
|
||
|
||
vp --> v.
|
||
|
||
|
||
Many syntactic niceties, such as subject-verb agreement, are
|
||
|
||
neglected.
|
||
|
||
|
||
|
||
2.2. The hold mechanism
|
||
|
||
|
||
When a relative pronoun is encountered during processing, it is
|
||
|
||
pushed onto a stack, from which it is retrieved when a gap is
|
||
|
||
found (i.e., when an NP is needed but not present). Thus
|
||
|
||
|
||
The donkey which the farmer feeds.
|
||
|
||
|
||
is parsed as if its structure were:
|
||
|
||
|
||
the donkey [s the farmer feeds which ]
|
||
|
||
|
||
That is, which is pushed onto the stack when encountered, then
|
||
|
||
carried along until a direct object for feeds is needed.
|
||
|
||
|
||
The pushdown stack handles nested relative clauses correctly:
|
||
|
||
|
||
The donkey which the man whom the woman loved ___ feeds ___.
|
||
|
||
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
4
|
||
|
||
|
||
The relative pronouns are retrieved from the stack in the
|
||
|
||
opposite of the order in which they are stored.
|
||
|
||
|
||
This hold mechanism is implemented by giving two additional
|
||
|
||
arguments to each phrasal node. For example, in the rule
|
||
|
||
|
||
vp(VP,H1,H2) --> v(V), np(NP,H1,H2).
|
||
|
||
|
||
H1 is the input to the hold mechanism and H2 is the output. More
|
||
|
||
precisely, upon entry to the rule H1 is instantiated to a
|
||
|
||
(usually empty) list representing the contents of the holding
|
||
|
||
stack before parsing the verb phrase. Upon exit from the rule, H2
|
||
|
||
will be instantiated to the contents of the holding stack after
|
||
|
||
parsing the verb phrase. In this case, H1 and H2 are simply
|
||
|
||
passed to the noun phrase, which makes whatever change is
|
||
|
||
required. The verb does not receive arguments for the holding
|
||
|
||
stack because it is not a phrasal node (a verb is a single word).
|
||
|
||
|
||
This technique is described more fully by Covington, Nute, and
|
||
|
||
Vellino (1988: 417-422).
|
||
|
||
|
||
Note crucially that in the current implementation the holding
|
||
|
||
stack contains, not the relative pronouns themselves, but
|
||
|
||
structures of the form rel(Index) where Index is a discourse
|
||
|
||
marker. Thus [rel(14),rel(10)] is what the holding stack looks
|
||
|
||
like when it contains relative pronouns modifying discourse
|
||
|
||
markers 10 and 14.
|
||
|
||
|
||
|
||
2.3. Feature structures
|
||
|
||
|
||
The bulk of the work of the parser is done by feature structures,
|
||
|
||
implemented using GULP. The first argument of each node, phrasal
|
||
|
||
or nonphrasal, contains a feature structure of the general form:
|
||
|
||
|
||
<20><> Ŀ
|
||
|
||
<20> syn: index: ... <20>
|
||
|
||
<20> class: ... <20>
|
||
|
||
<20> arg1: ... <20>
|
||
|
||
<20> arg2: ... <20>
|
||
|
||
<20> <20>
|
||
|
||
<20> sem: in: ... <20>
|
||
|
||
<20> out: ... <20>
|
||
|
||
<20> res: in: ... <20>
|
||
|
||
<20> out: ... <20>
|
||
|
||
<20> scope: in: ... <20>
|
||
|
||
<20> out: ... <20>
|
||
|
||
<20><> <20><>
|
||
|
||
|
||
Not all of the features are instantiated for every node. The
|
||
|
||
roles of the features are:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
5
|
||
|
||
|
||
index is the discourse marker (a number) associated with the
|
||
|
||
node. It is instantiated only on nouns and nodes that predicate
|
||
|
||
them (e.g., adjectives), dominate them (e.g., noun phrases), or
|
||
|
||
unify with them (e.g., pronouns). Unique indices are only created
|
||
|
||
for nouns (common and proper). The other nodes that have indices
|
||
|
||
obtain them by copying.
|
||
|
||
|
||
class is common or proper, instantiated on nouns, or transitive
|
||
|
||
or intransitive, instantiated on verbs.
|
||
|
||
|
||
arg1 and arg2 are the discourse markers of subject and direct
|
||
|
||
object, instantiated only on verbs and the nodes that dominate
|
||
|
||
them.
|
||
|
||
|
||
sem:in is the discourse representation structure as it exists
|
||
|
||
before processing the current node. When processing a discourse
|
||
|
||
consisting of several sentences, the feature sem:in will provide
|
||
|
||
the previous context within which to interpret the new sentence.
|
||
|
||
|
||
sem:out is the discourse representation structure after
|
||
|
||
processing the current node. The final semantic representation of
|
||
|
||
a sentence will be crucially influenced by its determiners.
|
||
|
||
|
||
sem:res and sem:scope are used for passing semantic information
|
||
|
||
to other constituents that modify the logical structure of the
|
||
|
||
sentence; they will be discussed further below (see 3.3).
|
||
|
||
|
||
|
||
3. DRS construction
|
||
|
||
|
||
3.1. Form of DRSes
|
||
|
||
|
||
A DRS is a set of discourse markers U and a set of conditions
|
||
|
||
Con, represented in Prolog as drs(U,Con), where both U and Con
|
||
|
||
are lists. Corresponding to each discourse marker there is a
|
||
|
||
condition giving its gender for pronoun reference. For example,
|
||
|
||
the sentence
|
||
|
||
|
||
Pedro owns a donkey. He feeds it.
|
||
|
||
|
||
having the following DRS
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
6
|
||
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
|
||
<20> 1 2 3 4 <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
|
||
<20> named(1,pedro)<29>
|
||
|
||
<20> gender(1,m) <20>
|
||
|
||
<20> donkey(2) <20>
|
||
|
||
<20> gender(2,n) <20>
|
||
|
||
<20> owns(1,2) <20>
|
||
|
||
<20> feeds(1,2) <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
|
||
is represented as
|
||
|
||
|
||
|
||
drs([1,2],
|
||
|
||
[named(1,pedro),gender(1,m),donkey(2),gender(2,n),
|
||
|
||
owns(1,2),feeds(1,2)]).
|
||
|
||
|
||
In practice, the DRS construction algorithm always works with a
|
||
|
||
list of DRSes. This list begins with the DRS currently under
|
||
|
||
construction, followed by all superordinate DRSes, so that all
|
||
|
||
accessible discourse markers can be found. This is not a cyclical
|
||
|
||
data structure because each superordinate DRS is represented as
|
||
|
||
it was before the current DRS was embedded in it.
|
||
|
||
|
||
Consider for instance the hypothetical DRS
|
||
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
|
||
<20> 1 2 <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
|
||
<20> a(1) <20>
|
||
|
||
<20> b(2) <20>
|
||
|
||
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ <20>
|
||
|
||
<20> <20> 3 4 <20> <20> 5 6 <20> <20>
|
||
|
||
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ --> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20>
|
||
|
||
<20> <20> c(3) <20> <20> e(5) <20> <20>
|
||
|
||
<20> <20> d(4) <20> <20> f(6) <20> <20>
|
||
|
||
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
at the moment when f(6) is being added. The active DRS is the one
|
||
|
||
containing 5 and 6, and two other DRSes are superordinate to it.
|
||
|
||
Thus the DRS list, as seen by the construction rules at that
|
||
|
||
moment, will be:
|
||
|
||
|
||
[drs([6,5],[f(6),e(5)]),
|
||
|
||
drs([4,3],[d(4),c(3)]),
|
||
|
||
drs([2,1],[b(2),a(1)])].
|
||
|
||
|
||
After the innermost DRS is built, construction rules for the
|
||
|
||
outer DRSes will perform the embeddings, resulting in the final
|
||
|
||
structure
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
7
|
||
|
||
|
||
[drs([2,1],
|
||
|
||
[ifthen(drs([4,3],[d(4),c(3)]),
|
||
|
||
drs([6,5],[f(6),e(5)])),
|
||
|
||
b(2),
|
||
|
||
a(1)])].
|
||
|
||
|
||
which will be displayed by display_drs as:
|
||
|
||
|
||
[1,2]
|
||
|
||
a(1)
|
||
|
||
b(2)
|
||
|
||
IF:
|
||
|
||
[3,4]
|
||
|
||
c(3)
|
||
|
||
d(4)
|
||
|
||
THEN:
|
||
|
||
[5,6]
|
||
|
||
e(5)
|
||
|
||
f(6)
|
||
|
||
|
||
restoring the original order in which elements were encountered.
|
||
|
||
|
||
|
||
3.2. Meaning = DRS change
|
||
|
||
|
||
Crucially, the meaning of a sentence, or of any constituent, is
|
||
|
||
the change in the DRS that occurs when that sentence or
|
||
|
||
constituent is processed. Thus every constituent's sem:in and
|
||
|
||
sem:out features differ in some way, and the difference
|
||
|
||
represents the meaning of that constituent. For example, if the
|
||
|
||
noun donkey were handled by a single rule, that rule would be
|
||
|
||
|
||
n(N) --> [donkey],
|
||
|
||
{ unique(I),
|
||
|
||
n = syn: (index:I ::
|
||
|
||
class:common) ::
|
||
|
||
sem: (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs([I|U],[donkey(I)|Con])|Super]) }.
|
||
|
||
|
||
This rule would do the following things:
|
||
|
||
|
||
(1) Generate a unique number and instantiate I to it. This number
|
||
|
||
becomes the discourse marker (index) of the noun.
|
||
|
||
|
||
(2) Unify the current DRS list with [drs(U,Con)|Super]. Here
|
||
|
||
drs(U,Con) is the DRS currently under construction and Super
|
||
|
||
contains zero or more superordinate DRSes.
|
||
|
||
|
||
(3) Add I to the list U, and add donkey(I) to the list Con, thus
|
||
|
||
adding the meaning of donkey to the DRS under construction.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
8
|
||
|
||
|
||
In the implementation presented here, however, this rule is
|
||
|
||
formulated in a more general way: it applies to the entire
|
||
|
||
category of common nouns. The particular semantics for donkey is
|
||
|
||
looked up in a table:
|
||
|
||
|
||
common_noun(donkey, lambda(X,[gender(X,n),donkey(X)])).
|
||
|
||
common_noun(farmer, lambda(X,[gender(X,m),farmer(X)])).
|
||
|
||
etc.
|
||
|
||
|
||
The rule for a verb is similar, but instead of adding an index to
|
||
|
||
U, it uses the indices that are passed to it as syntactic
|
||
|
||
arguments. Here are pseudo-rules for one- and two-argument verbs
|
||
|
||
(again, the real rules look up the semantics in a table):
|
||
|
||
|
||
v(V) --> [brays],
|
||
|
||
{ V = syn: (class:intransitive ::
|
||
|
||
arg1: A) ::
|
||
|
||
sem: (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs(U,[brays(A)|Con])|Super]) }.
|
||
|
||
|
||
v(V) --> [feeds],
|
||
|
||
{ V = syn: (class:transitive ::
|
||
|
||
arg1: A1 ::
|
||
|
||
arg2: A2) ::
|
||
|
||
sem: (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs(U,[feeds(A1,A2)|Con])|Super]) }.
|
||
|
||
|
||
The verb rules rely on other rules to pass them valid values of
|
||
|
||
arg1 and arg2. Of course, since this is a unification-based
|
||
|
||
process, it is order-independent; "passing a value" may merely
|
||
|
||
mean unifying A1 and A2 with variables that exist elsewhere and
|
||
|
||
will later be instantiated.
|
||
|
||
|
||
|
||
3.3. A note on proper nouns
|
||
|
||
|
||
Kamp (1981) originally treated proper nouns as a device for
|
||
|
||
direct reference, hence introducing different DRS-representations
|
||
|
||
for proper nouns or 'constants' on the one hand, and 'predicates'
|
||
|
||
(e.g. common nouns, adjectives, verbs, etc.) on the other. Thus
|
||
|
||
|
||
23 = john
|
||
|
||
|
||
identifies discourse referent 23 with John, whereas
|
||
|
||
|
||
boy(23)
|
||
|
||
|
||
says discourse referent 23 is a boy.
|
||
|
||
|
||
This account seems counter-intuitive since the same proper name
|
||
|
||
may very well refer to different individuals. As such, proper
|
||
|
||
names should not be interpreted as logical constants.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
9
|
||
|
||
|
||
In later work, Kamp (1983) and Guenthner (1986) revise the
|
||
|
||
original DRT account of proper names, but by introducing unary
|
||
|
||
predicates:
|
||
|
||
|
||
john(23)
|
||
|
||
|
||
In the implementation presented here, proper nouns are related to
|
||
|
||
their discourse marker(s) by means of a predicate named, e.g.,
|
||
|
||
named(23,'John'). Different individuals with the same name and
|
||
|
||
occurring within the same discourse no longer create a problem.
|
||
|
||
Further, the same individual can have more than one name (e.g.,
|
||
|
||
Hesperus and Phosphorus).
|
||
|
||
|
||
A second aspect of the proper noun problem is their
|
||
|
||
quantificational interpretation. In Kamp (1981), all proper nouns
|
||
|
||
are given an existential interpretation in that they
|
||
|
||
automatically rise to the universe of the topmost DRS. This makes
|
||
|
||
them accessible (as antecedents of anaphors) from anywhere in the
|
||
|
||
discourse.
|
||
|
||
|
||
Since DRT is not concerned with the outside world but rather with
|
||
|
||
mental models and their embeddings in a possible world model,
|
||
|
||
this approach does not have any trouble interpreting unicorns or
|
||
|
||
Santa Clauses: the discourse markers in DRT do not have real
|
||
|
||
world referents and their existence is only 'mental'.
|
||
|
||
|
||
|
||
3.4. The crucial role of determiners
|
||
|
||
|
||
The fundamental insight of the Johnson and Klein implementation
|
||
|
||
is that determiners, despite their minor syntactic role, are the
|
||
|
||
most important constituents for establishing the logical
|
||
|
||
structure of the sentence.
|
||
|
||
|
||
Syntactically, a determiner has only one argument: a noun (or NP
|
||
|
||
minus determiner). Semantically, however, we will follow Johnson
|
||
|
||
and Klein in saying that a determiner has two arguments:
|
||
|
||
|
||
restrictor: the remaining information within the NP.
|
||
|
||
|
||
scope: the predicate outside the NP.
|
||
|
||
|
||
For example, the sentence
|
||
|
||
|
||
A donkey brays.
|
||
|
||
|
||
can be translated into predicate logic as
|
||
|
||
|
||
(some X: donkey(X)) brays(X)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
10
|
||
|
||
|
||
where some X is the quantifier, donkey(X) is the restrictor (an
|
||
|
||
extra condition attached to the quantifier), and brays(X) is the
|
||
|
||
scope.
|
||
|
||
|
||
Accordingly, the DRS for A donkey brays is constructed by passing
|
||
|
||
the restrictor donkey and the scope brays to the determiner a.
|
||
|
||
This is achieved by several rules working together.
|
||
|
||
|
||
Consider first the rule for the simple sentence:
|
||
|
||
|
||
s(S) --> { NP = sem:A,
|
||
|
||
S = sem:A,
|
||
|
||
VP = sem:B,
|
||
|
||
NP = sem:scope:B,
|
||
|
||
NP = syn:index:C,
|
||
|
||
VP = syn:arg1:C }, np(NP), vp(VP).
|
||
|
||
|
||
(Here and in what follows, the hold mechanism is left out for
|
||
|
||
brevity.)
|
||
|
||
|
||
This rule says that:
|
||
|
||
|
||
(1) All the semantic features of the S are passed to the NP.
|
||
|
||
|
||
(2) The scope of the NP (and eventually of its determiner) is the
|
||
|
||
semantics of the VP (which comprises in and out features
|
||
|
||
although we do not see them here). Because of (1), this is
|
||
|
||
also the scope of the S.
|
||
|
||
|
||
(3) The index of the NP -- that is, its discourse marker -- is
|
||
|
||
the same as the subject (arg1) of the verb.
|
||
|
||
|
||
In this case the features of the VP are simply those of the verb.
|
||
|
||
But what happens in the NP?
|
||
|
||
|
||
The answer is given by the rule
|
||
|
||
|
||
np(NP) --> { N = syn:A,
|
||
|
||
NP = syn:A,
|
||
|
||
NP = sem:B,
|
||
|
||
Det = sem:B,
|
||
|
||
N = sem:C,
|
||
|
||
Det = sem:res:C }, det(Det), n(N).
|
||
|
||
|
||
(Again, this is simplified slightly; the actual grammar includes
|
||
|
||
the syntactic categories n1 and n2 intermediate between noun and
|
||
|
||
noun phrase.)
|
||
|
||
|
||
This rule says that an NP has the syntactic features of the noun
|
||
|
||
(crucially including index) but the semantic features of the
|
||
|
||
determiner. Further, the semantics of the noun becomes the
|
||
|
||
restrictor of the determiner.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
11
|
||
|
||
|
||
Finally, the determiner, receiving a scope and restrictor, must
|
||
|
||
incorporate them into the overall DRS in the correct way. The
|
||
|
||
task of the determiner a is very simple:
|
||
|
||
|
||
det(Det) --> [a],
|
||
|
||
{ Det = sem:in:A,
|
||
|
||
Det = sem:res:in:A,
|
||
|
||
Det = sem:res:out:B,
|
||
|
||
Det = sem:scope:in:B,
|
||
|
||
Det = sem:scope:out:C,
|
||
|
||
Det = sem:out:C }.
|
||
|
||
|
||
That is, pass the semantics to the restrictor, then to the scope,
|
||
|
||
letting each of them do its work. The determiner a is implicit in
|
||
|
||
DRT and has no special representation of its own.
|
||
|
||
|
||
Other determiners manipulate the DRS in more complex ways, e.g.
|
||
|
||
every:
|
||
|
||
|
||
det(Det) --> [every],
|
||
|
||
{ Det = sem:in:A,
|
||
|
||
Det = sem:res:in:[drs ([],[])|A],
|
||
|
||
Det = sem:res:out:B,
|
||
|
||
Det = sem:scope:in:[drs([],[])|B],
|
||
|
||
Det = sem:scope:out:[Scope,Res,drs(U,Con)|Super],
|
||
|
||
Det = sem:out:[drs(U,[ifthen(Res,Scope)|Con])|Super] }.
|
||
|
||
|
||
|
||
This order-independent process is hard to describe in a step-by-
|
||
|
||
step manner. It is recommended that the interested reader try
|
||
|
||
working out some examples of feature structure unifications by
|
||
|
||
hand.
|
||
|
||
|
||
|
||
3.5. "If-then" sentences
|
||
|
||
|
||
As explained in Kamp (1981), "if-then"2 sentences give rise to a
|
||
|
||
DRS-split: every way in which the IF is true carries with it a
|
||
|
||
way of the THEN being true. For example, the sentence
|
||
|
||
|
||
If a man loves a woman then a boojum sees a bandersnatch.
|
||
|
||
|
||
goes into DRT as
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
2 We call these "if-then sentences" rather than
|
||
|
||
"conditionals" because in DRT, "conditions" are the predicates in
|
||
|
||
a DRS, i.e., the truth-conditions of the DRS, and also because
|
||
|
||
some DRT "if-then" structures arise from sentences that do not
|
||
|
||
look superficially like conditionals in the logical sense.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
12
|
||
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
|
||
<20> 1 2 <20> <20> 3 4 <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
|
||
<20> man(1) <20> <20> boojum(3) <20>
|
||
|
||
<20> gender(1,m)<29> ---> <20> gender(3,n) <20>
|
||
|
||
<20> woman(2) <20> <20> bandersnatch(4)<29>
|
||
|
||
<20> gender(2,f)<29> <20> gender(4,n) <20>
|
||
|
||
<20> loves 1,2) <20> <20> sees(3,4) <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
|
||
|
||
|
||
and creates conditions of the form
|
||
|
||
|
||
|
||
ifthen(drs(U1,Con1), drs(U2,Con2)).
|
||
|
||
|
||
The embedding is performed by the S rule for sentences of the
|
||
|
||
form if X then Y, and by the Det rule for every.
|
||
|
||
|
||
|
||
3.6. Negated sentences
|
||
|
||
|
||
Negated sentences are handled by embedding a structure of the
|
||
|
||
form neg(drs(U,Con)) as a condition of a higher DRS. For example,
|
||
|
||
the S rule for sentences containing does not is:
|
||
|
||
|
||
s(S) --> { S = sem:in:A,
|
||
|
||
NP = sem:in:[drs([],[])|A],
|
||
|
||
VP = sem:C,
|
||
|
||
NP = sem:scope:C,
|
||
|
||
NP = syn:index:D,
|
||
|
||
VP = syn:arg1:D,
|
||
|
||
NP = sem:out:[X,drs(U,Con)|Super],
|
||
|
||
S = sem:out:[drs(U,[neg(X)|Con])|Super] },
|
||
|
||
np(NP), [does,not], vp(VP).
|
||
|
||
|
||
Crucially, this rule does not pass sem of S directly to sem of
|
||
|
||
NP. Instead, it intercepts sem:in of S and adds a new, empty DRS
|
||
|
||
at the beginning of it before passing it to NP. The processing of
|
||
|
||
the sentence then adds information to this new DRS. Then this
|
||
|
||
rule intercepts sem:out of NP, removes the new DRS (X), and
|
||
|
||
embeds it as a condition in the DRS that was previously at the
|
||
|
||
beginning of the list.
|
||
|
||
|
||
The determiner no performs a similar manipulation by intercepting
|
||
|
||
sem:in and sem:out of Det.
|
||
|
||
|
||
We do not account for all possible syntactic positions or
|
||
|
||
semantic interpretations of negation. For instance, not can have
|
||
|
||
as its syntactic argument an adjective or adverb:
|
||
|
||
|
||
Pedro's donkey is not brown but gray.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
13
|
||
|
||
|
||
This is a structure we do not account for.
|
||
|
||
|
||
Further, negated sentences containing quantifiers are often
|
||
|
||
ambiguous; for example,
|
||
|
||
|
||
Every man does not love a woman.
|
||
|
||
|
||
can mean either "every man fails to love" or "not every man
|
||
|
||
loves," and we account for only the latter reading.
|
||
|
||
|
||
|
||
3.7. Questions
|
||
|
||
|
||
Discourse representation theory does not provide a way to handle
|
||
|
||
questions. This system treats them like negated sentences except
|
||
|
||
that the embedding functor is query(...) rather than neg(...).
|
||
|
||
Thus the discourse:
|
||
|
||
|
||
Pedro loves Chiquita. Does she love him?
|
||
|
||
|
||
goes into DRT as
|
||
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
|
||
<20> 1 2 <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
|
||
<20> named(1,pedro) <20>
|
||
|
||
<20> gender(1,m) <20>
|
||
|
||
<20> named(2,chiquita) <20>
|
||
|
||
<20> gender(2,f) <20>
|
||
|
||
<20> loves(1,2) <20>
|
||
|
||
<20> <20>
|
||
|
||
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ <20>
|
||
|
||
<20> query: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20>
|
||
|
||
<20> <20>loves(2,1)<29> <20>
|
||
|
||
<20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
|
||
or, in the internal representation,
|
||
|
||
|
||
drs([1,2],[named(1,pedro),gender(1,m),named(2,chiquita),
|
||
|
||
gender(2,f),loves(1,2),
|
||
|
||
query(drs([],[loves(2,1)]))]).
|
||
|
||
|
||
|
||
|
||
4. Anaphora
|
||
|
||
|
||
4.1. The basic mechanism
|
||
|
||
|
||
DRT claims that an anaphoric pronoun can only refer to a
|
||
|
||
discourse marker in the current DRS or in a DRS immediately
|
||
|
||
superordinate to it. A DRS that encloses the current DRS is
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
14
|
||
|
||
|
||
superordinate to it; in addition, the left side of an "if-then"
|
||
|
||
structure is superordinate to the right side, but not vice versa.
|
||
|
||
|
||
As explained in section 3.3, proper names overrule these
|
||
|
||
accessibility conditions for anaphoric linking in that their
|
||
|
||
discourse markers always rise to the universe of the topmost DRS,
|
||
|
||
i.e., an NP can refer to any individual that has been previously
|
||
|
||
mentioned by proper name, regardless of the syntactic structure
|
||
|
||
of the discourse.
|
||
|
||
|
||
Recall that the sem:in feature passed to each constituent is not
|
||
|
||
a single DRS, but rather a list containing the current DRS plus
|
||
|
||
all DRSes that are superordinate to it. Accordingly, the
|
||
|
||
antecedent of an anaphoric pronoun (he, him, she, her, or it) is
|
||
|
||
found by searching the list of discourse markers for every DRS in
|
||
|
||
the list, looking for a discourse marker for which the correct
|
||
|
||
gender is recorded. This is done by rules such as:
|
||
|
||
|
||
np(NP) --> [he],
|
||
|
||
{ NP = sem:in:DRSlist,
|
||
|
||
member(drs(U,Con),DRSlist),
|
||
|
||
member(Index,U),
|
||
|
||
member(gender(Index2,m),Con), Index==Index2,
|
||
|
||
NP = syn:index:Index,
|
||
|
||
NP = sem:scope:in:DRSlist,
|
||
|
||
NP = sem:scope:out:Result,
|
||
|
||
NP = sem:out:Result }.
|
||
|
||
|
||
That is: Choose a drs(U,Con) in the DRS list; choose a discourse
|
||
|
||
marker Index in U; and check that gender(Index2,m) occurs in Con
|
||
|
||
and that Index and Index2 are already instantiated to the same
|
||
|
||
value. If this is the case, set the index of the current NP equal
|
||
|
||
to the index of the antecedent just found; pass the DRS list to
|
||
|
||
the scope of this NP (i.e., the VP); and take the result as
|
||
|
||
output.
|
||
|
||
|
||
This strategy will always find the most recent possible
|
||
|
||
antecedent first, because it begins searching the lists at the
|
||
|
||
most recently added item.
|
||
|
||
|
||
The implementation presented here does not establish equivalence
|
||
|
||
relations between different individuals with the same proper
|
||
|
||
name, nor between different proper names for the same individual.
|
||
|
||
|
||
|
||
4.2. Why some rules are upside down
|
||
|
||
|
||
The alert reader will have noticed that rules for phrasal nodes
|
||
|
||
have the unifications before the expansions, while rules for
|
||
|
||
single words have the unifications last, thus:
|
||
|
||
|
||
np(...) --> {...unifications...}, det(...), n(...).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
15
|
||
|
||
|
||
versus
|
||
|
||
|
||
n(...) --> [donkey], {...unifications...}.
|
||
|
||
|
||
There is a good reason for this. The calls to member that are
|
||
|
||
used in resolving anaphors require that the DRS list be
|
||
|
||
instantiated at the time member is called. In this, the anaphora
|
||
|
||
resolver deviates from strict unification-based grammar. By
|
||
|
||
performing the unifications for all phrasal nodes before parsing
|
||
|
||
the subordinate nodes, we ensure that the instantiations will
|
||
|
||
have taken place. When parsing a non-phrasal node, on the other
|
||
|
||
hand, we know that the anaphora resolver will not be called; the
|
||
|
||
first thing the parser should do is look at the actual form of
|
||
|
||
the word, so that if it has guessed wrong it can back out
|
||
|
||
immediately.
|
||
|
||
|
||
|
||
Bibliography
|
||
|
||
|
||
Covington, M. A. (1987) GULP 1.1: An extension of Prolog for
|
||
|
||
unification-based grammar. ACMC Research Report 00-0021,
|
||
|
||
University of Georgia.
|
||
|
||
|
||
Covington, M. A.; Nute, D.; and Vellino, A. (1988) Prolog
|
||
|
||
programming in depth. Glenview, Ill.: Scott, Foresman.
|
||
|
||
|
||
Guenthner, F. (1986) A theory for the representation of
|
||
|
||
knowledge. IBM Journal of Research and Development 30.1:39-
|
||
|
||
56.
|
||
|
||
|
||
Guenthner, F. (1987) Linguistic meaning in Discourse
|
||
|
||
Representation Theory. Synthese 73: 569-598.
|
||
|
||
|
||
Johnson, M., and Klein, E. (1986) Discourse, anaphora, and
|
||
|
||
parsing. CSLI Research Report 86-63, Stanford University.
|
||
|
||
|
||
Kamp, H. (1981) A theory of truth and semantic representation.
|
||
|
||
In Groenendijk et al. (eds.) Formal methods in the study of
|
||
|
||
language, 277-322. University of Amsterdam.
|
||
|
||
|
||
Kamp, H. (1983) SID without time or questions. Manuscript,
|
||
|
||
University of Texas, Austin.
|
||
|
||
|
||
Spencer-Smith, R. (1987) Semantics and discourse representation.
|
||
|
||
Mind and Language 2.1: 1-26.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
16
|
||
|
||
|
||
Appendix: Program listing
|
||
|
||
|
||
|
||
/********************************************************************
|
||
|
||
AN IMPLEMENTATION OF DISCOURSE REPRESENTATION THEORY
|
||
|
||
********************************************************************
|
||
|
||
|
||
/********************************************************************
|
||
|
||
Experimental implementation of Discourse Representation Theory
|
||
|
||
modeled on that of Johnson and Klein (CSLI Report 86-63).
|
||
|
||
Programmed by Michael Covington and Nora Schmitz, U. of Georgia.
|
||
|
||
Supported by National Science Foundation Grant IST-85-02477.
|
||
|
||
********************************************************************/
|
||
|
||
|
||
/********************************************************************
|
||
|
||
DECLARATIONS
|
||
|
||
********************************************************************/
|
||
|
||
|
||
g_features([in,out,syn,sem,index,scope,res,class,arg1,arg2]).
|
||
|
||
|
||
|
||
/********************************************************************
|
||
|
||
COMPUTATIONAL UTILITIES
|
||
|
||
********************************************************************/
|
||
|
||
|
||
/*
|
||
|
||
* reverse(List,Result)
|
||
|
||
* Fast list reversal with stacks.
|
||
|
||
* NOTE: If the tail of the list is uninstantiated, this procedure
|
||
|
||
* will instantiate it to nil. So don't use this procedure on
|
||
|
||
* open lists that need to remain open.
|
||
|
||
*/
|
||
|
||
|
||
reverse(List,Result) :-
|
||
|
||
nonvar(List),
|
||
|
||
reverse_aux(List,[],Result).
|
||
|
||
|
||
reverse_aux([],Result,Result).
|
||
|
||
|
||
reverse_aux([H|T],Stack,Result) :-
|
||
|
||
reverse_aux(T,[H|Stack],Result).
|
||
|
||
|
||
|
||
/*
|
||
|
||
* unique_integer(N)
|
||
|
||
* Unifies N with a different integer every time it is called.
|
||
|
||
*/
|
||
|
||
|
||
unique_integer(N) :- retract(unique_aux(N)),
|
||
|
||
NN is N+1,
|
||
|
||
assert(unique_aux(NN)),
|
||
|
||
!. /* Cut needed by Quintus, not Arity */
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
17
|
||
|
||
|
||
unique_aux(0).
|
||
|
||
|
||
|
||
/*
|
||
|
||
* add_to_topmost_drs(I,Semantics,DRSList,NewDRSList)
|
||
|
||
* Used to let the discourse markers for proper nouns rise to the
|
||
|
||
* universe part of the topmost DRS.
|
||
|
||
* I is an atom (the index); Semantics is a list of DRS-conditions.
|
||
|
||
*/
|
||
|
||
|
||
add_to_topmost_drs(I,Semantics,[drs(U,Con)],[drs([I|U],NewCon)]) :-
|
||
|
||
append(Semantics,Con,NewCon).
|
||
|
||
|
||
add_to_topmost_drs(I,Semantics,[H|T],[H|NewT]) :-
|
||
|
||
add_to_topmost_drs(I,Semantics,T,NewT).
|
||
|
||
|
||
|
||
/********************************************************************
|
||
|
||
I/O UTILITIES
|
||
|
||
********************************************************************/
|
||
|
||
|
||
/*
|
||
|
||
* display_drs(X)
|
||
|
||
* Outputs a readable representation of a DRS.
|
||
|
||
*/
|
||
|
||
|
||
display_drs(X) :- display_drs_indented(X,0).
|
||
|
||
|
||
display_drs_indented(X,N) :-
|
||
|
||
var(X),
|
||
|
||
!,
|
||
|
||
write(X),nl.
|
||
|
||
|
||
display_drs_indented(ifthen(X,Y),N) :-
|
||
|
||
!,
|
||
|
||
tab(N), write('IF:'), nl,
|
||
|
||
NN is N+2,
|
||
|
||
display_drs_indented(X,NN),
|
||
|
||
tab(N), write('THEN:'), nl,
|
||
|
||
display_drs_indented(Y,NN).
|
||
|
||
|
||
display_drs_indented(neg(X),N) :-
|
||
|
||
!,
|
||
|
||
tab(N), write('NOT:'), nl,
|
||
|
||
NN is N+2,
|
||
|
||
display_drs_indented(X,NN).
|
||
|
||
|
||
display_drs_indented(query(X),N) :-
|
||
|
||
!,
|
||
|
||
tab(N), write('QUERY:'), nl,
|
||
|
||
NN is N+2,
|
||
|
||
display_drs_indented(X,NN).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
18
|
||
|
||
|
||
display_drs_indented(drs(X,Y),N) :-
|
||
|
||
!,
|
||
|
||
reverse(X,RX),
|
||
|
||
tab(N), write(RX), nl,
|
||
|
||
reverse(Y,RY),
|
||
|
||
display_drs_indented(RY,N).
|
||
|
||
|
||
display_drs_indented([H|T],N) :-
|
||
|
||
!,
|
||
|
||
display_drs_indented(H,N),
|
||
|
||
display_drs_indented(T,N).
|
||
|
||
|
||
display_drs_indented([],_) :- !.
|
||
|
||
|
||
display_drs_indented(Cond,N) :-
|
||
|
||
tab(N), write(Cond), nl.
|
||
|
||
|
||
|
||
/********************************************************************
|
||
|
||
DRS-BUILDER
|
||
|
||
********************************************************************/
|
||
|
||
|
||
/***************************************
|
||
|
||
* Lexicon and lexical insertion rules *
|
||
|
||
***************************************/
|
||
|
||
|
||
/*
|
||
|
||
* Proper nouns.
|
||
|
||
*/
|
||
|
||
|
||
n(N) --> [Form],
|
||
|
||
{ proper_noun_features(Form,N) }.
|
||
|
||
/* add_to_topmost_drs }. */
|
||
|
||
|
||
proper_noun_features(Form,N) :-
|
||
|
||
proper_noun(Form,lambda(I,Semantics)),
|
||
|
||
append(Semantics,Con,NewCon),
|
||
|
||
unique_integer(I),
|
||
|
||
N = syn: (index:I ::
|
||
|
||
class:proper) ::
|
||
|
||
sem: (in: DRSList ::
|
||
|
||
out: NewDRSList),
|
||
|
||
add_to_topmost_drs(I,Semantics,DRSList,NewDRSList).
|
||
|
||
|
||
proper_noun(pedro, lambda(X,[gender(X,m),named(X,pedro)])).
|
||
|
||
proper_noun(chiquita, lambda(X,[gender(X,f),named(X,chiquita)])).
|
||
|
||
|
||
/*
|
||
|
||
* Common nouns.
|
||
|
||
*/
|
||
|
||
|
||
n(N) --> [Form],
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
19
|
||
|
||
|
||
{ common_noun_features(Form,N) }.
|
||
|
||
|
||
common_noun_features(Form,N) :-
|
||
|
||
common_noun(Form,lambda(I,Semantics)),
|
||
|
||
append(Semantics,Con,NewCon),
|
||
|
||
unique_integer(I),
|
||
|
||
N = syn: (index:I ::
|
||
|
||
class:common) ::
|
||
|
||
sem: (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs([I|U],NewCon)|Super]).
|
||
|
||
|
||
common_noun(bandersnatch,lambda(X,[gender(X,n),bandersnatch(X)])).
|
||
|
||
common_noun(boojum, lambda(X,[gender(X,n),boojum(X)])).
|
||
|
||
common_noun(man, lambda(X,[gender(X,m),man(X)])).
|
||
|
||
common_noun(woman, lambda(X,[gender(X,f),woman(X)])).
|
||
|
||
common_noun(donkey, lambda(X,[gender(X,n),donkey(X)])).
|
||
|
||
common_noun(farmer, lambda(X,[gender(X,m),farmer(X)])).
|
||
|
||
|
||
|
||
/*
|
||
|
||
* Adjectives.
|
||
|
||
*/
|
||
|
||
|
||
adj(Adj) --> [Form],
|
||
|
||
{ adjective_features(Form,Adj) }.
|
||
|
||
|
||
adjective_features(Form,Adj) :-
|
||
|
||
adjective(Form,lambda(I,Semantics)),
|
||
|
||
append(Semantics,Con,NewCon),
|
||
|
||
Adj = syn: (index:I) ::
|
||
|
||
sem: (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs(U,NewCon)|Super]).
|
||
|
||
|
||
adjective(big, lambda(X,[big(X)])).
|
||
|
||
adjective(green, lambda(X,[green(X)])).
|
||
|
||
adjective(rich, lambda(X,[rich(X)])).
|
||
|
||
adjective(old, lambda(X,[old(X)])).
|
||
|
||
adjective(happy, lambda(X,[happy(X)])).
|
||
|
||
|
||
/*
|
||
|
||
* Transitive verbs.
|
||
|
||
*/
|
||
|
||
|
||
v(V) --> [Form],
|
||
|
||
{ transitive_verb_features(Form,V) }.
|
||
|
||
|
||
transitive_verb_features(Form,V) :-
|
||
|
||
transitive_verb(Form,lambda(A1,A2,Semantics)),
|
||
|
||
append(Semantics,Con,NewCon),
|
||
|
||
V = syn: (class:transitive ::
|
||
|
||
arg1:A1 ::
|
||
|
||
arg2:A2) ::
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
20
|
||
|
||
|
||
sem: (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs(U,NewCon)|Super]).
|
||
|
||
|
||
transitive_verb(see, lambda(X,Y,[sees(X,Y)])).
|
||
|
||
transitive_verb(sees, lambda(X,Y,[sees(X,Y)])).
|
||
|
||
transitive_verb(love, lambda(X,Y,[loves(X,Y)])).
|
||
|
||
transitive_verb(loves, lambda(X,Y,[loves(X,Y)])).
|
||
|
||
transitive_verb(own, lambda(X,Y,[owns(X,Y)])).
|
||
|
||
transitive_verb(owns, lambda(X,Y,[owns(X,Y)])).
|
||
|
||
transitive_verb(have, lambda(X,Y,[has(X,Y)])).
|
||
|
||
transitive_verb(has, lambda(X,Y,[has(X,Y)])).
|
||
|
||
transitive_verb(beat, lambda(X,Y,[beats(X,Y)])).
|
||
|
||
transitive_verb(beats, lambda(X,Y,[beats(X,Y)])).
|
||
|
||
transitive_verb(feed, lambda(X,Y,[feeds(X,Y)])).
|
||
|
||
transitive_verb(feeds, lambda(X,Y,[feeds(X,Y)])).
|
||
|
||
|
||
|
||
/*
|
||
|
||
* Intransitive verbs.
|
||
|
||
*/
|
||
|
||
|
||
v(V) --> [Form],
|
||
|
||
{ intransitive_verb_features(Form,V) }.
|
||
|
||
|
||
intransitive_verb_features(Form,V) :-
|
||
|
||
intransitive_verb(Form,lambda(Arg,Semantics)),
|
||
|
||
append(Semantics,Con,NewCon),
|
||
|
||
V = syn : (class:intransitive ::
|
||
|
||
arg1:Arg) ::
|
||
|
||
sem : (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs(U,NewCon)|Super]).
|
||
|
||
|
||
intransitive_verb(bark, lambda(X,[barks(X)])).
|
||
|
||
intransitive_verb(barks, lambda(X,[barks(X)])).
|
||
|
||
intransitive_verb(eat, lambda(X,[eats(X)])).
|
||
|
||
intransitive_verb(eats, lambda(X,[eats(X)])).
|
||
|
||
intransitive_verb(bray, lambda(X,[brays(X)])).
|
||
|
||
intransitive_verb(brays, lambda(X,[brays(X)])).
|
||
|
||
|
||
/*
|
||
|
||
* Determiners, each with its own semantics.
|
||
|
||
*/
|
||
|
||
|
||
det(Det) --> ([a] ; [an]),
|
||
|
||
{ Det = sem:in:A,
|
||
|
||
Det = sem:res:in:A, /* Pass 'sem:in' to 'res'. */
|
||
|
||
Det = sem:res:out:B,
|
||
|
||
Det = sem:scope:in:B, /* Pass 'res:out' to 'scope:in'. */
|
||
|
||
Det = sem:scope:out:C,
|
||
|
||
Det = sem:out:C }. /* Whatever comes out of
|
||
|
||
'scope:out' is the final
|
||
|
||
result for the whole
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
21
|
||
|
||
|
||
sentence. */
|
||
|
||
|
||
det(Det) --> [every],
|
||
|
||
{ Det = sem:in:A,
|
||
|
||
Det = sem:res:in:[drs([],[])|A],
|
||
|
||
Det = sem:res:out:B,
|
||
|
||
Det = sem:scope:in:[drs([],[])|B],
|
||
|
||
Det = sem:scope:out:[Scope,Res,drs(U,Con)|Super],
|
||
|
||
Det = sem:out:[drs(U,[ifthen(Res,Scope)|Con])|Super] }.
|
||
|
||
|
||
det(Det) --> [no],
|
||
|
||
{ Det = sem:in:A,
|
||
|
||
Det = sem:res:in:[drs([],[])|A],
|
||
|
||
Det = sem:res:out:B,
|
||
|
||
Det = sem:scope:in:B,
|
||
|
||
Det = sem:scope:out:[DRS,drs(U,Con)|Super],
|
||
|
||
Det = sem:out:[drs(U,[neg(DRS)|Con])|Super] }.
|
||
|
||
|
||
det(Det) --> [not,every],
|
||
|
||
{ Det = sem:in:A,
|
||
|
||
Det = sem:res:in:[drs([],[])|A],
|
||
|
||
Det = sem:res:out:B,
|
||
|
||
Det = sem:scope:in:[drs([],[])|B],
|
||
|
||
Det = sem:scope:out:[Scope,Res,drs(U,Con)|Super],
|
||
|
||
Det = sem:out:
|
||
|
||
[drs(U,[neg(drs([],[ifthen(Res,Scope)]))|Con])|Super] }.
|
||
|
||
|
||
/**************************
|
||
|
||
* Phrase structure rules *
|
||
|
||
**************************/
|
||
|
||
|
||
/*
|
||
|
||
* n1: a common noun preceded by zero or more adjectives.
|
||
|
||
*/
|
||
|
||
|
||
n1(N1,H,H) --> n(N1).
|
||
|
||
|
||
n1(N1A,H1,H2) -->
|
||
|
||
{ N1A = syn:A,
|
||
|
||
Adj = syn:A,
|
||
|
||
N1B = syn:A, /* Indices are syntactic, not semantic. */
|
||
|
||
N1A = sem:in:B,
|
||
|
||
N1B = sem:in:B,
|
||
|
||
N1B = sem:out:C,
|
||
|
||
Adj = sem:in:C,
|
||
|
||
Adj = sem:out:D,
|
||
|
||
N1A = sem:out:D },
|
||
|
||
adj(Adj), n1(N1B,H1,H2).
|
||
|
||
|
||
/*
|
||
|
||
* n2: a common noun of type n1 optionally followed by relative clause.
|
||
|
||
*/
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
22
|
||
|
||
|
||
n2(N2,H1,H2) --> n1(N2,H1,H2).
|
||
|
||
|
||
n2(N2,H1,H3) -->
|
||
|
||
{ N2 = syn:Syn,
|
||
|
||
N1 = syn:Syn,
|
||
|
||
RC = syn:Syn, /* Pass index to 'RC'. */
|
||
|
||
N2 = sem:in:S1,
|
||
|
||
N1 = sem: (in:S1 :: out:S2),
|
||
|
||
RC = sem: (in:S2 :: out:S3),
|
||
|
||
N2 = sem:out:S3 },
|
||
|
||
n1(N1,H1,H2), relcl(RC,H2,H3).
|
||
|
||
/* A noun phrase ending with a
|
||
|
||
relative clause. */
|
||
|
||
|
||
/*
|
||
|
||
* Noun phrases. */
|
||
|
||
|
||
np(NP,H,H) -->
|
||
|
||
{ N = syn:class:proper,
|
||
|
||
N = syn:A,
|
||
|
||
NP = syn:A, /* 'NP' gets its syntax from 'N'. */
|
||
|
||
N = sem:B,
|
||
|
||
NP = sem:res:B, /* 'NP' gets its restrictor from 'N'. */
|
||
|
||
NP = sem:in:C,
|
||
|
||
NP = sem:res:in:C, /* Pass 'sem:in' through 'res'. */
|
||
|
||
NP = sem:res:out:D,
|
||
|
||
NP = sem:scope:in:D, /* Pass on through 'scope' */
|
||
|
||
NP = sem:scope:out:E,
|
||
|
||
NP = sem:out:E },
|
||
|
||
n(N). /* Proper names do not take
|
||
|
||
determiners. */
|
||
|
||
|
||
np(NP,H1,H2) -->
|
||
|
||
{ N2 = syn:class:common,
|
||
|
||
N2 = syn:C,
|
||
|
||
NP = syn:C, /* 'NP' gets its syntax from 'N'. */
|
||
|
||
Det = sem:A,
|
||
|
||
NP = sem:A, /* 'NP' gets its semantics from 'Det'. */
|
||
|
||
N2 = sem:B,
|
||
|
||
Det = sem:res:B }, /* 'Det' gets its restrictor from 'N'. */
|
||
|
||
det(Det), n2(N2,H1,H2).
|
||
|
||
|
||
/*
|
||
|
||
* Trace (gap) from moved relative pronoun.
|
||
|
||
*/
|
||
|
||
|
||
np(NP,[rel(Index)|Rest],Rest) --> [], /* Trace from moved relative
|
||
|
||
pronoun. */
|
||
|
||
{ NP = sem:in:B, /* This kind of NP has no semantics
|
||
|
||
and hence no restrictor. */
|
||
|
||
NP = sem:scope:in:B,
|
||
|
||
NP = sem:scope:out:C,
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
23
|
||
|
||
|
||
NP = sem:out:C,
|
||
|
||
NP = syn:index:Index }.
|
||
|
||
|
||
/*
|
||
|
||
* Anaphoric pronouns, with anaphora resolving routine.
|
||
|
||
*/
|
||
|
||
|
||
np(NP,H,H) --> ([he];[him]),
|
||
|
||
{ NP=sem:in:DrsList,
|
||
|
||
member(drs(U,Con),DrsList),
|
||
|
||
member(Index,U),
|
||
|
||
member(gender(Index2,m),Con), Index == Index2,
|
||
|
||
NP=syn:index:Index,
|
||
|
||
NP=sem:scope:in:DrsList,
|
||
|
||
NP=sem:scope:out:DrsOut,
|
||
|
||
NP=sem:out:DrsOut }.
|
||
|
||
|
||
np(NP,H,H) --> ([she];[her]),
|
||
|
||
{ NP=sem:in:DrsList,
|
||
|
||
member(drs(U,Con),DrsList),
|
||
|
||
member(Index,U),
|
||
|
||
member(gender(Index2,f),Con), Index == Index2,
|
||
|
||
NP=syn:index:Index,
|
||
|
||
NP=sem:scope:in:DrsList,
|
||
|
||
NP=sem:scope:out:DrsOut,
|
||
|
||
NP=sem:out:DrsOut }.
|
||
|
||
|
||
np(NP,H,H) --> [it],
|
||
|
||
{ NP=sem:in:DrsList,
|
||
|
||
member(drs(U,Con),DrsList),
|
||
|
||
member(Index,U),
|
||
|
||
member(gender(Index2,n),Con), Index == Index2,
|
||
|
||
NP=syn:index:Index,
|
||
|
||
NP=sem:scope:in:DrsList,
|
||
|
||
NP=sem:scope:out:DrsOut,
|
||
|
||
NP=sem:out:DrsOut }.
|
||
|
||
|
||
/*
|
||
|
||
* Verb phrases.
|
||
|
||
*/
|
||
|
||
|
||
vp(VP,H1,H2) -->
|
||
|
||
{ V = syn:class:transitive,
|
||
|
||
V = syn:D,
|
||
|
||
VP = syn:D, /* 'VP' gets its syntax from 'V'. */
|
||
|
||
NP = sem:A,
|
||
|
||
VP = sem:A, /* 'VP' gets its semantics from 'NP'. */
|
||
|
||
NP = syn:index:C,
|
||
|
||
VP = syn:arg2:C, /* 'VP' gets its object index from 'NP'. */
|
||
|
||
V = sem:B,
|
||
|
||
NP = sem:scope:B }, /* 'NP' gets its scope from 'V'. */
|
||
|
||
v(V), np(NP,H1,H2).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
24
|
||
|
||
|
||
vp(VP,H,H) --> v(VP),
|
||
|
||
{ VP = syn:class:intransitive }.
|
||
|
||
|
||
/*
|
||
|
||
* Relative clauses.
|
||
|
||
*/
|
||
|
||
|
||
relcl(RC,H1,H2) --> { RC = syn:index:Index,
|
||
|
||
RC = sem:Sem,
|
||
|
||
S = sem:Sem },
|
||
|
||
([who];[whom];[which];[that]), s(S,[rel(Index)|H1],H2).
|
||
|
||
|
||
/*
|
||
|
||
* Simple sentences.
|
||
|
||
*/
|
||
|
||
|
||
s(S,H1,H3) -->
|
||
|
||
{ NP = sem:A,
|
||
|
||
S = sem:A, /* Pass 'NP=sem' to 'S=sem'. */
|
||
|
||
VP = sem:C,
|
||
|
||
NP = sem:scope:C, /* Pass 'VP=sem' to 'NP=sem:scope'. */
|
||
|
||
NP = syn:index:D,
|
||
|
||
VP = syn:arg1:D }, /* Pass 'NP=syn:index' to 'VP=syn:arg1'. */
|
||
|
||
np(NP,H1,H2), vp(VP,H2,H3).
|
||
|
||
|
||
s(S,H1,H3) -->
|
||
|
||
/*
|
||
|
||
* Note: "does not" is given sentential scope here.
|
||
|
||
* That is, "Every man does not love a woman" is
|
||
|
||
* taken to mean "It is not the case that every
|
||
|
||
* man loves a woman."
|
||
|
||
*/
|
||
|
||
{ S = sem:in:A,
|
||
|
||
NP = sem:in:[drs([],[])|A],
|
||
|
||
VP = sem:C,
|
||
|
||
NP = sem:scope:C,
|
||
|
||
NP = syn:index:D,
|
||
|
||
VP = syn:arg1:D,
|
||
|
||
NP = sem:out:[DRS,drs(U,Con)|Super],
|
||
|
||
S = sem:out:[drs(U,[neg(DRS)|Con])|Super] },
|
||
|
||
np(NP,H1,H2), [does,not], vp(VP,H2,H3).
|
||
|
||
|
||
s(S,H1,H2) -->
|
||
|
||
{ S = sem:A,
|
||
|
||
NP = sem:A,
|
||
|
||
NP = sem:scope:B,
|
||
|
||
Adj = sem:B,
|
||
|
||
NP = syn:C, /* Pass along the syntax. */
|
||
|
||
Adj = syn:C },
|
||
|
||
np(NP,H1,H2), [is], adj(Adj).
|
||
|
||
|
||
s(S,H1,H2) -->
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
25
|
||
|
||
|
||
{ S = sem:in:A,
|
||
|
||
NP = sem:in:[drs([],[])|A],
|
||
|
||
NP = sem:out:[DRS,drs(U,Con)|Super],
|
||
|
||
S = sem:out:[drs(U,[neg(DRS)|Con])|Super],
|
||
|
||
NP = sem:scope:B,
|
||
|
||
Adj = sem:B,
|
||
|
||
NP = syn:C,
|
||
|
||
Adj = syn:C },
|
||
|
||
np(NP,H1,H2), [is,not], adj(Adj).
|
||
|
||
|
||
s(S,H1,H3) -->
|
||
|
||
{ S = sem:A,
|
||
|
||
NP1 = sem:A,
|
||
|
||
NP2 = sem:B,
|
||
|
||
NP1 = sem:scope:B,
|
||
|
||
NP1 = syn:index:A1,
|
||
|
||
NP2 = syn:index:A2,
|
||
|
||
NP2 = sem:scope: (in: [drs(U,Con)|Super] ::
|
||
|
||
out: [drs(U,[(A1=A2)|Con])|Super]) },
|
||
|
||
np(NP1,H1,H2), [is], np(NP2,H2,H3).
|
||
|
||
|
||
s(S,H1,H3) -->
|
||
|
||
{ S = sem:in:A,
|
||
|
||
NP1 = sem:in:[drs([],[])|A],
|
||
|
||
NP1 = sem:out:[DRS,drs(U1,Con1)|Super1],
|
||
|
||
S = sem:out:[drs(U1,[neg(DRS)|Con1])|Super1],
|
||
|
||
NP2 = sem:B,
|
||
|
||
NP1 = sem:scope:B,
|
||
|
||
NP1 = syn:index:A1,
|
||
|
||
NP2 = syn:index:A2,
|
||
|
||
NP2 = sem:scope: (in: [drs(U2,Con2)|Super2] ::
|
||
|
||
out: [drs(U2,[(A1=A2)|Con2])|Super2]) },
|
||
|
||
np(NP1,H1,H2), [is,not], np(NP2,H2,H3).
|
||
|
||
|
||
|
||
/*
|
||
|
||
* Complex sentences.
|
||
|
||
*/
|
||
|
||
|
||
s(S,H,H) -->
|
||
|
||
{ S = sem:in: A,
|
||
|
||
S1 = sem:in: [drs([],[])|A],
|
||
|
||
S1 = sem:out:B,
|
||
|
||
S2 = sem:in: [drs([],[])|B],
|
||
|
||
S2 = sem:out:[S2DRS,S1DRS,drs(U,Con)|Super],
|
||
|
||
S = sem:out:[drs(U,[ifthen(S1DRS,S2DRS)|Con])|Super] },
|
||
|
||
[if], s(S1,[],[]), [then], s(S2,[],[]).
|
||
|
||
/* Empty hold lists enforce Coordinate
|
||
|
||
Structure Constraint. */
|
||
|
||
|
||
/*
|
||
|
||
* Statements, i.e., top-level, non-embedded sentence.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
26
|
||
|
||
|
||
*/
|
||
|
||
|
||
statement(S) --> s(S,[],[]).
|
||
|
||
|
||
/*
|
||
|
||
* Questions.
|
||
|
||
*/
|
||
|
||
|
||
question(Q) -->
|
||
|
||
{ Q = sem:in:A,
|
||
|
||
NP = sem:in:[drs([],[])|A],
|
||
|
||
VP = sem:C,
|
||
|
||
NP = sem:scope:C,
|
||
|
||
NP = syn:index:D,
|
||
|
||
VP = syn:arg1:D,
|
||
|
||
NP = sem:out:[DRS,drs(U,Con)|Super],
|
||
|
||
Q = sem:out:[drs(U,[query(DRS)|Con])|Super] },
|
||
|
||
[does], np(NP,[],H2), vp(VP,H2,[]).
|
||
|
||
|
||
|
||
question(Q) -->
|
||
|
||
{ Q = sem:in:A,
|
||
|
||
NP = sem:in:[drs([],[])|A],
|
||
|
||
NP = sem:out:[DRS,drs(U,Con)|Super],
|
||
|
||
Q = sem:out:[drs(U,[query(DRS)|Con])|Super],
|
||
|
||
NP = sem:scope:B,
|
||
|
||
Adj = sem:B,
|
||
|
||
NP = syn:C,
|
||
|
||
Adj = syn:C },
|
||
|
||
[is], np(NP,[],[]), adj(Adj).
|
||
|
||
|
||
|
||
question(Q) -->
|
||
|
||
{ Q = sem:in:A,
|
||
|
||
NP1 = sem:in:[drs([],[])|A],
|
||
|
||
NP1 = sem:out:[DRS,drs(U1,Con1)|Super1],
|
||
|
||
Q = sem:out:[drs(U1,[query(DRS)|Con1])|Super1],
|
||
|
||
NP2 = sem:B,
|
||
|
||
NP1 = sem:scope:B,
|
||
|
||
NP1 = syn:index:A1,
|
||
|
||
NP2 = syn:index:A2,
|
||
|
||
NP2 = sem:scope: (in: [drs(U2,Con2)|Super2] ::
|
||
|
||
out: [drs(U2,[(A1=A2)|Con2])|Super2]) },
|
||
|
||
[is], np(NP1,[],[]), np(NP2,[],[]).
|
||
|
||
|
||
/*
|
||
|
||
* Discourse
|
||
|
||
* [a,discourse,is,a,series,of,consecutive,sentences,
|
||
|
||
* separated,by,endpuncts,like,this,'.',note,that,an,
|
||
|
||
* endpunct,is,required,after,the,final,sentence,'!']
|
||
|
||
*/
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
27
|
||
|
||
|
||
discourse(D1) -->
|
||
|
||
{ D1 = sem:in:A,
|
||
|
||
S = sem:in:A,
|
||
|
||
S = sem:out:B,
|
||
|
||
D2 = sem:in:B,
|
||
|
||
D2 = sem:out:C,
|
||
|
||
D1 = sem:out:C },
|
||
|
||
( statement(S) ; question(S) ), endpunct, {!}, discourse(D2).
|
||
|
||
|
||
discourse(D) --> [],
|
||
|
||
{ D = sem:in:A,
|
||
|
||
D = sem:out:A }.
|
||
|
||
|
||
/*
|
||
|
||
* Endpunct (sentence terminator).
|
||
|
||
*/
|
||
|
||
|
||
endpunct --> ['.'] ; ['?'] ; ['!'].
|
||
|
||
|
||
|
||
|
||
/********************************************************************
|
||
|
||
TEST SUITE
|
||
|
||
********************************************************************/
|
||
|
||
|
||
try(String) :- append(String,['.'],Discourse),
|
||
|
||
tryd(Discourse).
|
||
|
||
|
||
tryd(String) :- write(String),nl,
|
||
|
||
Features = sem:in:[drs([],[])],
|
||
|
||
phrase(discourse(Features),String),
|
||
|
||
Features = sem:out:DRS,
|
||
|
||
DRS = [Current|Super],
|
||
|
||
display_drs(Current).
|
||
|
||
|
||
test1 :- try([a,man,sees,a,donkey]).
|
||
|
||
test2 :- try([a,donkey,sees,a,man]).
|
||
|
||
test3 :- try([every,man,sees,a,donkey]).
|
||
|
||
test4 :- try([every,man,sees,every,donkey]).
|
||
|
||
test5 :- try([if,a,man,loves,a,woman,then,a,boojum,sees,a,bandersnatch]).
|
||
|
||
test6 :- try([if,every,man,loves,a,woman,
|
||
|
||
then,every,boojum,sees,a,bandersnatch]).
|
||
|
||
test7 :- try([no,man,loves,every,woman]).
|
||
|
||
test8 :- try([every,man,loves,no,bandersnatch]).
|
||
|
||
test9 :- try([no,woman,loves,a,bandersnatch]).
|
||
|
||
test10 :- try([no,woman,loves,no,man]).
|
||
|
||
test11 :- try([a,woman,does,not,love,a,man]).
|
||
|
||
test12 :- try([a,man,does,not,love,every,woman]).
|
||
|
||
test13 :- try([every,boojum,does,not,see,every,bandersnatch]).
|
||
|
||
test14 :- try([pedro,owns,a,donkey]).
|
||
|
||
test15 :- try([pedro,loves,chiquita]).
|
||
|
||
test16 :- try([a,man,sees,pedro]).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
28
|
||
|
||
|
||
test17 :- try([pedro,has,a,big,green,donkey]).
|
||
|
||
test18 :- try([no,man,has,a,green,donkey]).
|
||
|
||
test19 :- try([if,pedro,has,a,big,green,donkey,then,pedro,has,chiquita]).
|
||
|
||
test20 :- tryd([a,man,loves,a,woman,'.',pedro,owns,a,donkey,'.']).
|
||
|
||
test21 :- tryd([if,pedro,owns,a,donkey,then,pedro,owns,a,big,donkey,'.',
|
||
|
||
chiquita,loves,a,man,'.',
|
||
|
||
chiquita,does,not,love,pedro,'.']).
|
||
|
||
test22 :- tryd([a,donkey,brays,'.']).
|
||
|
||
test23 :- tryd([if,pedro,owns,a,donkey,then,every,donkey,brays,'.']).
|
||
|
||
test24 :- tryd([pedro,is,big,'.']).
|
||
|
||
test25 :- tryd([no,donkey,is,green,'.']).
|
||
|
||
test26 :- tryd([every,big,green,donkey,is,old,'.']).
|
||
|
||
test27 :- tryd([pedro,is,a,man,'.']).
|
||
|
||
test28 :- tryd([every,big,green,donkey,is,an,old,donkey,'.']).
|
||
|
||
test29 :- tryd([pedro,is,not,big,'.']).
|
||
|
||
test30 :- tryd([every,donkey,is,not,big,'.']).
|
||
|
||
test31 :- tryd([pedro,is,not,a,donkey,'.']).
|
||
|
||
test32 :- tryd([every,donkey,is,not,a,man,'.']).
|
||
|
||
test33 :- tryd([not,every,man,is,big,'.']).
|
||
|
||
test34 :- tryd([if,not,every,man,is,big,then,pedro,is,not,big,'.']).
|
||
|
||
test35 :- tryd([not,every,man,is,a,bandersnatch,'.']).
|
||
|
||
test36 :- tryd([every,man,who,owns,a,bandersnatch,is,rich,'.']).
|
||
|
||
test37 :-
|
||
|
||
tryd([every,man,who,does,not,own,a,bandersnatch,that,brays,is,old,'.']).
|
||
|
||
test38 :-
|
||
|
||
tryd([a,man,who,owns,a,bandersnatch,that,does,not,bray,is,happy,'.']).
|
||
|
||
test39 :-
|
||
|
||
tryd([a,man,whom,a,bandersnatch,that,does,not,bray,loves,is,happy,'.']).
|
||
|
||
test40 :- tryd([pedro,owns,a,donkey,'.',he,is,happy,'.']).
|
||
|
||
test41 :- tryd([if,pedro,owns,a,donkey,then,he,is,happy,'.']).
|
||
|
||
test42 :- tryd([every,woman,whom,pedro,loves,is,happy,'.']).
|
||
|
||
test43 :- tryd([pedro,is,a,man,'.',chiquita,loves,him,'.']).
|
||
|
||
test44 :- tryd([chiquita,is,a,farmer,'.',she,feeds,a,donkey,'.']).
|
||
|
||
test45 :- tryd([every,farmer,who,owns,a,donkey,beats,it,'.']).
|
||
|
||
test46 :- tryd([if,a,farmer,owns,a,donkey,then,he,beats,it,'.']).
|
||
|
||
test47 :- tryd([is,pedro,a,man,'?']).
|
||
|
||
test48 :- tryd([does,pedro,own,a,donkey,'?']).
|
||
|
||
test49 :- tryd([does,every,farmer,own,a,donkey,'?']).
|
||
|
||
test50 :- tryd([does,every,farmer,who,owns,a,donkey,beat,it,'?']).
|
||
|
||
test51 :- tryd([chiquita,is,a,woman,'.',is,she,happy,'?']).
|
||
|
||
test52 :- tryd([pedro,loves,chiquita,'.',does,she,love,him,'?']).
|
||
|
||
|