a simple DCG for Dutch



next up previous
Next: About this document Up: An Overview of Head Previous: Generation times for

a simple DCG for Dutch

Each node is a term where is used for a gap threading analysis of topicalization; percolates information on verb second; and is a simple derivation tree. is a term representing syntactic information and represents the argument structure, input for generation.

Arguments of are predicates that are executed during compilation. Thus some of these rules will become `metarules', in case these executable calls have several solutions. The `object' grammar is thus somewhat larger.

partial_ex( extra/2 ).  partial_ex( verb/4 ).
partial_ex( aux/5 ).    partial_ex( member/2 ).
partial_ex( topicalizable/1) .

% main -> topic v0 s
x(main/LF,X-X,nil,main(T,V,S)) --> 
  x(Topic, Y-Y, nil, T),  { topicalizable(Topic) },
  x(v0(VT,fin,B,C)/VS,Z-Z,nil,V),
  x(s(fin)/LF,Topic-nil,v0(VT,fin,B,C)/VS,S).

topicalizable(np(_)/_).   topicalizable(pp/_).

% sbar -> comp s
x(sbar(fin)/LF,I-I,nil,sbar(C,S)) -->        
  x(comp(fin,SS)/LF,O-O,nil,C),
  x(s(fin)/SS,P-P,nil,S).

x(sbar(infin,Sj)/LF,I-I,nil,sbar(C,S)) -->
  x(comp(infin,SS)/LF,O-O,nil,C),
  x(vp(te,Sj,[])/SS,P-P,nil,S).

% s -> np vp
x(s(VF)/LF,I-O,Verb,s(SS,VV)) --> 
  x(np(Agr)/Sj,I-O2,nil,SS), 
  x(vp(VF,np(Agr)/Sj,[])/LF,O2-O,Verb,VV).
% vp -> compl vp
x(vp(VF,S,T)/LF,I-O,V,vp(C,VP)) -->
  x(H,I-O2,nil,C),  { extra(H,no) },
  x(vp(VF,S,[H|T])/LF,O2-O,V,VP).

% vp -> vp compl (extraposition)
x(vp(VF,S,T)/LF,I-O,V,vp(VP,C)) -->
  x(vp(VF,S,[H|T])/LF,O2-O,V,VP),
  x(H,I-O2,nil,C),   { extra(H,yes) }.

extra(sbar(_)/_,yes).  extra(sbar(_,_)/_,yes). % must be extraposed
extra(np(_)/_,no).     extra(part/_,no).       % may not 
extra(pp/_,_).                                 % can be extraposed

% vp -> v1
x(vp(VF,Sj,Sc)/LF,I-O,V,vp(VV)) -->
  x(v(VF,Sj,Sc-[])/LF,I-O,V,VV).
% v1 -> v0
x(v(VF,Sj,Sc)/LF,I-O,V,v(VV)) -->
  x(v0(main,VF,Sj,Sc)/LF,I-O,V,VV).

% v1 -> aux v1
x(v(F,Sj,Sc)/LF,I-O,V,v(A,B)) -->
  x(v0(aux,F,Sj,v(_A,_B,_C)/_S+Sc)/LF,I-I2,V,A),
  x(v(_A,_B,_C)/_S,I2-O,nil,B).

% gap -> v0
gap(x(v0(VT,fin,Sj,Sc)/LF,_,nil,Tree),
  x(v0(VT,fin,Sj,Sc)/LF,X-X,v0(VT,fin,Sj,Sc)/LF,vgap)).

% np -> det n
x(np(Nm)/LF,I-I,nil,np(Det,N)) -->
  x(det(Ns,Nm)/LF,nil-nil,nil,Det),
  x(n(Nm)/Ns,nil-nil,nil,N).

% pp -> p np
x(pp/LF,I-I,nil,pp(P,NP)) --> 
  x(p(Np)/LF,J-J,nil,P), 
  x(np(_)/Np,O-O,nil,NP).

% topic -> 
x(Topic,Topic-nil,nil,topic_gap) --> 
  { topicalizable( Topic ) }.
x(np(sg)/john,I-I,nil,np(john)) --> [jan].
x(np(sg)/mary,I-I,nil,np(mary)) --> [marie].
x(np(sg)/jane,I-I,nil,np(jane)) --> [jane].
x(np(sg)/tarzan,I-I,nil,np(tarzan)) --> [tarzan].
x(n(sg)/sg(man),I-I,nil,n(man)) --> [man].
x(n(pl)/pl(man),I-I,nil,n(mannen)) --> [mannen].
x(n(sg)/sg(woman),I-I,nil,n(vrouw)) --> [vrouw].
x(n(pl)/pl(woman),I-I,nil,n(vrouwen)) --> [vrouwen].
x(n(sg)/sg(mashed_potatoes),I-I,nil,n(puree)) --> [puree].
x(det(Ns,_)/Ns,I-I,nil,det(de)) --> [de].
x(det(Ns,pl)/Ns,I-I,nil,det(e)) --> [].
x(p(Np)/naar(Np),I-I,nil,p(naar)) --> [naar].
x(p(Np)/in(Np),I-I,nil,p(in)) --> [in].
x(p(Np)/van(Np),I-I,nil,p(van)) --> [van].
x(p(Np)/aan(Np),I-I,nil,p(aan)) --> [aan].
x(part/op,I-I,nil,part(op)) --> [op].
x(comp(fin,S)/dat(S),O-O,nil,comp(dat)) --> [dat].
x(comp(fin,S)/because(S),O-O,nil,comp(dat)) --> [omdat].
x(comp(infin,S)/S,O-O,nil,comp(om)) --> [om].
x(comp(infin,S)/S,O-O,nil,comp(om)) --> [].
% verbs and auxes pick out an inflectional variant:
x(v0(main,Fin,np(Agr)/A1,Sc)/LF,I-I,nil,v0(Form)) -->
  [ Form ],   { verb(LF,np(Agr)/A1,Sc,List),
  member(Fin/Agr/Form,List) }.

x(v0(aux,Fin,np(Agr)/A1,Verb+Sc)/LF,I-I,nil,aux(Form)) -->
  [ Form ],   { aux(LF,Verb,Sc,np(Agr)/A1,List),
  member(Fin/Agr/Form,List) }.

verb(sleep(A1),_/A1,X-X, 
  [fin/sg/slaapt,fin/pl/slapen,infin/_/slapen,part/_/geslapen]).

verb(catch(A1,A2),_/A1,[part/op,np(_)/A2|X]-X,   %particle verb
  [fin/sg/vangt,fin/pl/vangen,infin/_/vangen,part/_/gevangen]).

verb(in_trouble(A1),_/A1,[pp/in(sg(mashed_potatoes))|X]-X, %idiom
  [fin/sg/zit,fin/pl/zitten,infin/_/zitten,part/_/gezeten]).

verb(kiss(A1,A2),_/A1,[np(_)/A2|X]-X,
  [fin/sg/kust,fin/pl/kussen,infin/_/kussen,part/_/gekust]).
verb(say(A1,A2),_/A1,[sbar(fin)/dat(A2)|X]-X,
  [fin/sg/zegt,fin/pl/zeggen,infin/_/zeggen,part/_/gezegd]).

% object control
verb(force(A1,A2,A3),Sj/A1,[sbar(infin,Sj/A1)/A3,np(_)/A2|X]-X,
  [fin/sg/dwingt,fin/pl/dwingen,infin/_/dwingen,part/_/gedwongen]).

verb(try(A1,A2),Sj/A1,[sbar(infin,Sj/A1)/A2|X]-X,  % subject control
  [fin/sg/probeert,fin/pl/proberen,infin/_/proberen,part/_/geprobeerd]).

verb(give(A1,A2,A3),_/A1,[np(_)/A2,np(_)/A3|X]-X,
  [fin/sg/geeft,fin/pl/geven,infin/_/geven,part/_/gegeven]).

verb(give(A1,A2,A3),_/A1,[pp/aan(A3),np(_)/A2|X]-X,
  [fin/sg/geeft,fin/pl/geven,infin/_/geven,part/_/gegeven]).
aux(perf(X),v(part,np(Agr)/A1,Sc)/X,Sc,np(Agr)/A1,
  [ fin/sg/heeft,fin/pl/hebben,infin/_/hebben, part/_/gehad]).

aux(fut(X),v(infin,np(Agr)/A1,Sc)/X,Sc,np(Agr)/A1,
  [ fin/sg/zal,fin/pl/zullen,infin/_/zullen ]).

aux(X,v(infin,Sj,Sc)/X,Sc,Sj,[ te/_/te ] ).

aux(try(A1,A2),v(te,_/A1,Sc)/A2,Sc,np(Agr)/A1, %raising
  [ fin/sg/probeert,fin/pl/proberen,infin/_/proberen,part/_/proberen ] ).

aux(see(A1,A2),v(infin,Sj,A-[Sj|E])/A2,A-E,np(Agr)/A1, % aci raising
  [ fin/sg/ziet, fin/pl/zien, infin/_/zien,part/_/zien ] ).

aux(help(A1,A2),v(infin,Sj,A-[Sj|E])/A2,A-E,np(Agr)/A1, % aci raising
  [ fin/sg/helpt, fin/pl/helpen,infin/_/helpen,part/_/helpen ] ).



Gertjan van Noord
Fri Nov 25 13:07:08 MET 1994