% Verb Phrase rules
%

:- multifile best_parse_cats/1, rule/2.
:- dynamic best_parse_cats/1, rule/2.

% Best Parse Categories
best_parse_cats([fvp,nfvp,np,pp]).
%

%% FVP -> VP(tensed)
rule(fvp(edge:Edge,person:P,number:N,tense:past,voice:V,m_root:R,
    sem:E^[VSem,[realisation,E,Edge]]),
    [vp(m_root:R,voice:V,person:P,number:N,tense:past,sem:E^VSem)]).
rule(fvp(edge:Edge,person:P,number:N,tense:present,voice:V,m_root:R,
    sem:E^[VSem,[realisation,E,Edge]]),
    [vp(m_root:R,voice:V,person:P,number:N,tense:present,sem:E^VSem)]).

%% NFVP -> VP(untensed)
% may overgenerate for -ing forms when preceding auxiliaries are not
% caught
rule(nfvp(edge:Edge,person:P,number:N,tense:none,voice:V,vform:F,m_root:R,
    sem:E^[VSem,[realisation,E,Edge]]),
    [vp(m_root:R,voice:V,person:P,number:N,vform:F,tense:none,sem:E^VSem)]).

rule(vp(edge:Edge,person:P,number:N,tense:T,voice:V,m_root:R,
    sem:E^[VSem,[realisation,E,Edge]]),
    [vpcore(m_root:R,voice:V,person:P,number:N,tense:T,vform:base,sem:E^VSem)]).

%attach NP complement as object
%% VP -> VPCORE NP
rule(vp(edge:Edge,person:P,number:N,tense:T,voice:active,m_root:R,
    sem:E^X^[VSem,[lobj,E,X],NPSem,[realisation,E,Edge]]),
    [vpcore(voice:active,m_root:R,person:P,number:N,tense:T,sem:E^VSem),
     np(sem:X^NPSem)]).

% attach VPINF complement as object -- note there is no way to link
% subjects here -- must be done in DI (which should also note that
% the complement event has a time(E,none) attribute
%% VP -> VPCORE VP(to)
%  planned to launch
%  is scheduled to launch
rule(vp(edge:Edge,person:P,number:N,tense:T,voice:V,m_root:R,
    sem:E1^E2^[VSem,[infcomp,E1,E2],InfSem,[realisation,E,Edge]]),
    [vpcore(voice:V,m_root:R,person:P,number:N,tense:T,sem:E1^VSem),
     nfvp(vform:base,sem:E2^InfSem)]).

%% VP -> be PREMOD
rule(vp(edge:Edge,person:P,number:N,tense:T,voice:active,m_root:R,
    sem:E^X^[VSem,[adj,E,X],NPSem,[realisation,E,Edge],[realisation,X,AdjEdge]]),
    [vpcore(voice:active,m_root:be,person:P,number:N,tense:T,sem:E^VSem),
     premod(edge:AdjEdge,sem:X^NPSem)]).

%% VP -> passive-VPCORE PP
rule(vp(edge:Edge,person:P,number:N,tense:T,voice:passive,m_root:R,
    sem:E^Subj^[VSem,[lsubj,E,Subj],[[by,E,Subj],PPNPSem],
    [realisation,E,Edge]]),
    [vpcore(voice:passive,m_root:R,person:P,number:N,tense:T,sem:E^VSem),
     pp(sem:E^Subj^[[by,E,Subj],PPNPSem])]).


%% VP -> VP CC VP
rule(vp(edge:Edge,sem:E^X^[VPSem1,VPSem2,[coord,E,X],[realisation,E,Edge]]),
    [vp(sem:E^VPSem1),
     cc(_),
     vp(sem:X^VPSem2)]).

%% VP -> TO VP
%rule(vp(sem:VPSem),
%    [to(_),
%     vp(sem:VPSem)]).


%%attach a PP complement, binding the PP to the verb
%%VP -> VPCORE PP
rule(vp(edge:Edge,person:P,number:N,tense:T,voice:V,m_root:R,
    sem:E^Head^[VSem,PPSem,[realisation,E,Edge]]),
    [vpcore(voice:V,m_root:R,person:P,number:N,tense:T,sem:E^VSem),
     pp(sem:E^Head^PPSem)]).

% look inside pp if necessary...
%    pp(sem:E^Head^[[of,E,Head]|PPSem])