Edges

The notion of edges in NL-Soar refers to the current boundaries of a constituent. NL-Soar calculates edges each time a link is made, so that as a tree branches right, the right-edge is updated. Consider the tree in the image below:

The NP the man is a constituent. If the word-id of the is F2 and the word-id of man is F4, then the left-edge of the NP is F2 and the right-edge is F4. The left-edge of the CP is F2 and the right-edge is the word-id of the verb, lets say F8.

Edges are important because they constrain the syntax generate-operator proposals. Thus, a link between the constituent the horse and the man likes is only possible if the right-edge of likes is adjacent (according to ^adjacency-info) to the left-edge of the horse.

The productions for calculating edges can be found in the file edges.elab.soar. Notice that these productions are not like regular Soar productions, in that their right hand sides are not tied to a particular state. For example, the production:

sp {compute-edges*xp*right
   ( ^bar-level max -^annotation dominates-trace ^head.right-edge )
 -->
   ( ^right-edge )}

can fire at any time and in any problem-space or state. This is needed because snips could occur during deliberate processing and so the edge values could change. If they were not recalculated immediately, then the entire repair could not be completed in a single u-constructor. Thus we allow these productions to have unconnected right hand sides, but in general we note that this is lousy Soar programming style. Unconnected right hand sides could lead to difficult chunking problems (i.e. "Unable to reorder chunk") when the chunker tries to build chunks over work that included these productions.

Written by Julie Van Dyke (vandyke@cs.cmu.edu) August, 1997