% 1) Top of UDC: realizing filler
s(nogap) --> np(nogap),
             s(gap).

s(nogap) --> pp(nogap),
             s(gap).

% 2) Middle of UDC: passing info
s(GapInfo) --> np(nogap),    % no subject gaps
               vp(GapInfo).

vp(GapInfo) --> vt,
                np(GapInfo).

vp(GapInfo) --> vd,
                np(GapInfo),
                pp(nogap).

vp(GapInfo) --> vd,
                np(nogap),
                pp(GapInfo).

pp(GapInfo) --> p,
                np(GapInfo).

% 3) Bottom of UDC                          
np(gap)   --> [].   
pp(gap)   --> [].

% "Lexicon"
np(nogap) --> [mary];[john];[fido].
p  --> [to].
vt --> [loves].
vd --> [gives].
