Each dimension states which principles it uses, and their parameters. The principles are taken from the predefined principle library of the XDK. The principle library includes the definitions of the available principles. Developers can add new principles using the interface described in the developer sections.
To use a principle, you need to specify two mappings:
The dimension mapping
binds dimension variables
to dimension identifiers. Each principle definition introduces a set
of dimension variables which must be bound upon principle use.
Lex
and This
are special dimension variables, always bound to dimensions lex
and to the currently defined dimension, respectively.
The argument mapping binds argument variables (or just arguments for short) to values. Each principle definition introduces a set of arguments, their types, and (optionally) their default values. Each argument which is not provided upon principle use gets its default value. If it does not have a default value, the XDK grammar file compiler raises an exception.
In the UL, the expression to use a principle is:
useprinciple <constant> {dims { <variable_1>:<constant_1> ... <variable_n>:<constant_n> } args { <variable_1>:<term_1> ... <variable_m>:<term_m> } }
Here, <constant>
is the principle identifier. In the
dims
part, you specify the dimension mapping, and in the
args
part, you specify the argument mapping.
In the following, we give a set of example of how principles are used
in our example grammar Grammars/Acl01.ul
. Note that this manual
contains detailed descriptions of all principles in the predefined
principle library in Principles list.
Here is how the principle principle.graph
is used on the id
dimension of our example grammar file:
useprinciple "principle.graph" { dims {D: id}}
The identifier of the principle is principle.graph
. The
dimension mapping maps the dimension variable D
to the
dimension identifier id
. The argument mapping is empty.
The principle.graph
principle posits that the structure on the
dimension bound to the dimension variable D
is a
graph1. It has no arguments.
In the example, the principle posits that the id dimension is a graph.
Here is how the principle principle.tree
is used on the id
dimension of our example grammar file:
useprinciple "principle.tree" { dims {D: id}}
The identifier of the principle is principle.tree
. The
dimension mapping maps the dimension variable D
to the
dimension identifier id
. The argument mapping is empty.
The principle.tree
principle posits that the structure on
dimension D
is a tree. The principle does not have any
arguments.
In the example, the principle posits that the id dimension is a tree.
Here is how the principle principle.valency
is used on the id
dimension of our example grammar file:
useprinciple "principle.valency" { dims {D: id} args {In: _.D.entry.in Out: _.D.entry.out}}
The identifier of the principle is principle.valency
. The
dimension mapping maps the dimension variable D
to the
dimension identifier id
. The argument mapping is empty.
The principle.valency
principle constrains the incoming and
outgoing edges of each node on dimension D
. The In
and
Out
arguments each specify a valency.
The default values of the In
and Out
arguments are the
feature paths
_.D.entry.in
and _.D.entry.out
, respectively.
In the example, the values of the In
and Out
arguments
are not provided, thus the grammar file compiler uses the default
values _.D.entry.in
and _.D.entry.out
, respectively.
That is, for each node v, In
equals the the value of the
field in
of the entry of v on the id dimension, and
Out
equals the value of the field out
of the entry of
v.
Before we proceed, here is a short introduction of feature paths. Feature paths are used to access fields in the attributes or in the entry of a node. In the UL, the syntax for a feature path is:
<root var>.<dim var>.(attrs|entry).<field_1>.....<field_n>
Feature paths start with a root variable
(<root var>
) which states which node shall be accessed. The
root variable is either “up” or “down” (in the UL, this
corresponds to ^
or _
). Each principle can bind “up”
and “down” to arbitrary nodes. By convention, “up” means
“mother”, and “down” means “daughter” (for constraints on
edges), and “down” means “myself” (for constraints on nodes). As
the valency principle states a constraint on nodes, the root variable
_
in the example _.D.entry.out
denotes “myself”.
The second argument of a feature path is a dimension variable
(<dim var>
) specifying the dimension of the value which is
eventually accessed. In the example _.D.entry.out
, the
dimension variable is D
.
The third argument of a feature path is one of the special constants
attrs
or entry
. If you choose attrs
, you access
the attributes, and if you choose entry
, you access the lexical
entry. In the example _.D.entry.out
, the lexical entry is
accessed. Thus, the principle is lexicalized.
The fourth argument of a feature path is a list (separated by dots) of
fields describing the path to the accessed value. In the example
_.D.entry.out
, the list consists only of the field out
.
Here is how the principle principle.agr
is used on the id
dimension of our example grammar file:
useprinciple "principle.agr" { dims {D: id} args {Agr: _.D.attrs.agr Agrs: _.D.entry.agrs}}
The identifier of the principle is principle.agr
. The dimension
mapping maps the dimension variable D
to the dimension
identifier id
. The argument mapping maps the argument
Agr
to the feature path _.D.attrs.agr
, and Agrs
to _.D.entry.agrs
.
The principle.agr
principle has the two arguments Agr
and Agrs
. The agr principle posits the constraint that for all
nodes Agr
is an element of Agrs
.
The resulting constraint here is the following: for all nodes
v, the value of the node attribute field agr
is an
element of the value of the lexical entry field agrs
.
Here is how the principle principle.agreement
is used on the id
dimension of our example grammar file:
useprinciple "principle.agreement" { dims {D: id} args {Agr1: ^.D.attrs.agr Agr2: _.D.entry.agr Agree: ^.D.entry.agree}}
The identifier of the principle is principle.agreement
. The
dimension mapping maps the dimension variable D
to the
dimension identifier id
. The argument mapping maps the argument
Agr1
to the feature path ^.D.attrs.agr
, Agr2
to
_.D.attrs.agr
, and Agree
to ^.D.entry.agree
.
The principle.agreement
principle has the three arguments
Agr1
, Agr2
and Agree
. It posits the constraint
that for all edges from mother v to daughter v' labeled
by l, if l is in the set described by Agree
,
Agr1
must equal Agr2
.
In the example, this constraint amounts to the stipulation that for
all edges from mother v to daughter v' labeled by
l, if l is in the set lexically specified by the
agree
feature of the mother on the id dimension (feature path
^.D.entry.agree
), then the node attribute agr
must be
equal for both the mother v (feature path ^.D.attrs.agr
and the daughter v' (feature path _.D.attrs.agr
.
Here is how the principle principle.government
is used on the id
dimension of our example grammar file:
useprinciple "principle.government" { dims {D: id} args {Agr2: _.D.attrs.agr Govern: ^.D.entry.govern}}
The identifier of the principle is principle.agreement
. The
dimension mapping maps the dimension variable D
to the
dimension identifier id
. The argument mapping maps the argument
Agr2
to the feature path _.D.attrs.agr
, and
Govern
to ^.D.entry.govern
.
The principle.government
principle has the two arguments
Agr2
and Government
. It posits the constraint that for
all edges from mother v to daughter v' labeled by
l, Agr2
must be in the set prescribed by Govern
for label l.
In the example, this constraint amounts to the stipulation that for
all edges from mother v to daughter v' labeled by
l, the value of the agr
field of the node attributes of
the daughter v' (feature path _.D.attrs.agr
) must be in
the set of labels prescribed by the field govern
of the lexical
entry of the mother v (feature path ^.D.entry.govern
).
Here is how the principle principle.order
is used on the lp
dimension of our example grammar file:
useprinciple "principle.order" { dims {D: lp} args {Order: [d df n mf vcf p pf v vxf] On: _.D.entry.on Yields: true}}
Here, the principle identifier is principle.order
. The
dimension mapping maps dimension variable D
to dimension
identifier lp
. The argument mapping maps the argument
Order
to the list [d df n mf vcf p pf v vxf]
, On
to the feature path _.D.entry.on
, and Yields
to
true
.
The principle.order
principle constrains the linear order of
the nodes. In particular, it orders the yields or daughters of each
node according to their edge label. The Order
argument
specifies a total order on a subset of the set of edge labels (as a
list). The On
argument specifies the set of possible node
labels
for each node used to position it with respect to its daughters. The
domain of node labels is the same as the domain of edge labels. The
Yields
argument can be either true
or false
,
depending on whether for each node, its entire subgraphs shall be
ordered (true
), or just its daughters (false
). If the
order principle is used in conjunction with the
principle.projectivity
, which is most frequently the case, then
setting Yields
to true is just an optimization for solving, but
does not change the number of solutions.
The default value of the Order
argument is the empty list. The
default value of the On
argument is the feature path
_.D.entry.on
. The default value of the Yields
argument
is false
.
In the example, the total order on the set of edge labels is [d
df n mf vcf p pf v vxf]
, i.e. all daughters with edge label (or the
mother with node label) d
precede all those with edge label
df
, and so on. The On
argument is set to
_.D.entry.on
, i.e., for each node v, the set of possible
node labels of v equals the value of the field on
of the
entry of v on the lp dimension. The Yields
argument is
set to true
.
Here is how the principle principle.projectivity
is used on the
lp dimension of our example grammar file:
useprinciple "principle.projectivity" { dims {D: lp}}
Here, the principle identifier is principle.projectivity
. The
dimension mapping maps dimension variable D
to dimension
identifier lp
. The argument mapping is empty.
The principle.projectivity
principle constrains the analysis on
the dimension D
to be projective.
In the example, the principle is used on the lp dimension.
Here is how the principle principle.climbing
is used on the
idlp dimension of our example grammar file:
useprinciple "principle.climbing" { dims {D1: lp D2: id}}
Here, the principle identifier is principle.climbing
. The
dimension mapping maps dimension variable D1
to dimension
identifier lp
, and dimension variable D2
to dimension
id
. The argument mapping is empty.
The principle.climbing
principle posits that the graph on
dimension D1
must be flattening of the graph on dimension
D2
. It is called “climbing” since this flattening is the
result of nodes “climbing up” metaphorically from the deep dimension
D2
to the flat dimension D1
. The principle introduces
two arguments. The Subgraphs
argument is either true
or
false
, depending on whether each node is required to take its
entire subgraph along when migrating upwards (true
), or not
(false
). The MotherCards
argument specifies whether for
each node, the cardinalities of the sets of mothers on D1
and
D2
must be equal (true
), or not (false
). This is
an optimization for the case that both D1
and D2
are
trees. If any of the two is not a tree, MotherCards
should be
set to false
.
The default value of Subgraphs
and MotherCards
is true
.
In the example, the principle posits that the graph on the lp
dimension must be a flattening of the graph on the id dimension. By
default, Subgraphs
and MotherCards
are set to
true
, i.e. each node must take its entire subgraph along when
climbing up, and the cardinalities of its sets of mothers on the id
and lp dimensions are equal.
Here is how the principle principle.barriers
is used on the
idlp dimension of our example grammar file:
useprinciple "principle.barriers" { dims {D1: lp D2: id D3: idlp}}
Here, the principle identifier is principle.barriers
. The
dimension mapping maps dimension variable D1
to dimension
identifier lp
, D2
to dimension id
and D3
to idlp
. The argument mapping binds the argument variable
Blocks
to the feature path _.D3.entry.blocks
.
The principle.barriers
principle is a specialization of the
climbing principle. Its purpose is to “block” nodes in the “deep”
dimension D2
from climbing up and appearing higher up in the
“flat” dimension D1
. The principle introduces an argument
Blocks
whose default value is _.D3.entry.blocks
. The
value of Blocks
is a set edge labels on the “deep” dimension
D2
. For each node v, all nodes below v which have
one of these incoming edge labels on the “deep” dimension D2
must stay below v on the “flat” dimension D1
.
In the example, the “flat” dimension is the lp dimension, and the
“deep” dimension is the id dimension. The value of the Blocks
argument is lexicalized: for each node v, it equals the value
of the blocks
field of the entry of v on the idlp
dimension.
Here is how the principle principle.linkingEnd
is used on the
idlp dimension of our example grammar file:
useprinciple "principle.linkingEnd" { dims {D1: lp D2: id}}
Here, the principle identifier is principle.linkingEnd
. The
dimension mapping maps dimension variable D1
to dimension
identifier lp
, and dimension variable D2
to dimension
id
. The argument mapping is empty.
The principle.linkingEnd
principle constrains all outgoing
edges from node v1 to node v2 labeled l on
dimension D1
with respect to the incoming edge label l'
of v2 on dimension D2
. The principle introduces the
argument End
whose value is a function from the set of edge
labels on D1
to sets of edge labels on D2
. The default
value of the End
is ^.D3.entry.end
.
An edge v1 to node v2 labeled l on dimension
D1
is only licensed if the incoming edge label l' of
v2 on dimension D2
is an element of the set specified by
the applying the function in the End
argument to label
l.
In the example, the End
argument is not provided. By default,
it is lexicalized and equals for each node v_1 the value of the
end
field of the entry of v_1 on the idlp dimension.
Here is how the principle principle.entries
is used on the lex
dimension of our example grammar file:
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%% %% use principles useprinciple "principle.entries" {}
Here, the principle identifier is principle.entries
. The
dimension mapping is empty. The argument mapping is also empty.
The purpose of the principle.entries
principle is to ensure
that for each node, precisely one lexical entry is selected. If you
do not use the entries principle, and there are two identical lexical
entries for a word in the input, the XDK solver does not select one of
the two. If you do use it, it does select one, i.e. it enumerates all
possible lexical entries for a word in the input.
[1] Currently, the principle library includes two graph
principles: principle.graph
and principle.graph1
. The
latter leads to faster solving than the former, but it is cannot be
used together with several principles of the principle library, and is
thus quite obsolete.