L3 is what is left of L2 when the goal for VP succeeds. When the goal for VP succeeds, the goal for S succeeds as well, so that that goal returns the list that is passed to it by the succeeding VP goal. Using difference lists solves the problems noted earlier in a very nice way. Since every goal is passed a value, the parsing process is constrained by the form of the input, as desired. Every time a terminal is found in the lexicon, the difference lists gets eaten a little bit more.
Natural languages are full of agreement phenomena.
A grammar for a particular language has to enforce the agreement restrictions that are operative in that language. Take English, a language you know a little bit about. Of course this means that determiners and nouns must be specified for number features in the lexicon. It is often useful to produce a parse-tree for a successful parse. This can be achieved very easily by adding an argument to each node.