%%%% version 1.3 2003-07-11 /* Copyright (C) Wolfgang Menzel, Universität Hamburg, 2003-07-10 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ %%% a simple grammar for english sentences (same as dcg_diag.pl) but %%% calling the web-based user interface tutor_server_grammar.pl :- nl. :- write_ln('an English grammar with feature unification'). :- write_ln('agreement, subcategorisation, e.g. '). :- write_ln('the man was nice'). :- write_ln('the woman makes the man loving the house'). :- write_ln('she gave her the book'). :- nl. % the dictionary det(det(the),sg) --> [the]. det(det(the),pl) --> [the]. % change all the other entries accordingly det(det(a),sg) --> [a]. det(det(an),sg) --> [an]. det(det(some),sg) --> [some]. det(det(this),sg) --> [this]. det(det(these),pl) --> [these]. det(det(those),sg) --> [those]. det(det(those),pl) --> [those]. n(n(man),sg) --> [man]. n(n(men),pl) --> [men]. n(n(woman),sg) --> [woman]. n(n(women),pl) --> [women]. n(n(fish),_) --> [fish]. n(n(house),sg) --> [house]. n(n(houses),pl) --> [houses]. n(n(book),sg) --> [book]. n(n(books),pl) --> [books]. adj(adj(good)) --> [good]. adj(adj(happy)) --> [happy]. adj(adj(nice)) --> [nice]. cop(cop(am),first,sg,pres) --> [am]. cop(cop(are),second,sg,pres) --> [are]. cop(cop(is),third,sg,pres) --> [is]. cop(cop(are),_,pl,pres) --> [are]. cop(cop(was),first,sg,past) --> [was]. cop(cop(were),second,sg,past) --> [were]. cop(cop(was),third,sg,past) --> [was]. cop(cop(were),_,pl,past) --> [were]. verb(v(sleep),first,sg,pres,[],[]) --> [sleep]. verb(v(sleep),second,sg,pres,[],[]) --> [sleep]. verb(v(sleep),_,pl,pres,[],[]) --> [sleep]. verb(v(sleeps),third,sg,pres,[],[]) --> [sleep]. verb(v(slept),_,_,past,[],[]) --> [slept]. verb(v(love),first,sg,pres,[np(_,_,_,dat,_)],[]) --> [love]. verb(v(love),first,sg,pres,[np(_,_,_,nondat,_)], [government(verb,dir_obj,case,dat,nondat)]) --> [love]. verb(v(love),second,sg,pres,[np(_,_,_,dat,_)],[]) --> [love]. verb(v(love),second,sg,pres,[np(_,_,_,nondat,_)], [government(verb,dir_obj,case,dat,nondat)]) --> [love]. verb(v(love),_,pl,pres,[np(_,_,_,dat,_)],[]) --> [love]. verb(v(love),_,pl,pres,[np(_,_,_,nondat,_)], [government(verb,dir_obj,case,dat,nondat)]) --> [love]. verb(v(loves),third,sg,pres,[np(_,_,_,dat,_)],[]) --> [loves]. verb(v(loves),third,sg,pres,[np(_,_,_,nondat,_)], [government(verb,dir_obj,case,dat,nondat)]) --> [loves]. verb(v(loved),_,_,past,[np(_,_,_,dat,_)],[]) --> [loved]. verb(v(loved),_,_,past,[np(_,_,_,nondat,_)], [government(verb,dir_obj,case,dat,nondat)]) --> [loved]. verb(v(give),first,sg,pres,[np(_,_,_,dat,_),np(np(det(_),_),_,_,nondat,_)], []) --> [give]. verb(v(give),first,sg,pres,[np(_,_,_,nondat,_),np(np(det(_),_),_,_,nondat,_)], [government(verb,indir_obj,case,dat,nondat)]) --> [give]. verb(v(give),first,sg,pres,[np(np(det(_),_),_,_,nondat,_),np(_,_,_,dat,_)], [lp(dir_obj,indir_obj)]) --> [give]. verb(v(give),second,sg,pres,[np(_,_,_,dat,_),np(np(det(_),_),_,_,nondat,_)], []) --> [give]. verb(v(give),second,sg,pres,[np(_,_,_,nondat,_),np(np(det(_),_),_,_,nondat,_)], [government(verb,indir_obj,case,dat,nondat)]) --> [give]. verb(v(give),second,sg,pres,[np(np(det(_),_),_,_,nondat,_),np(_,_,_,dat,_)], [lp(dir_obj,indir_obj)]) --> [give]. verb(v(give),_,pl,pres,[np(_,_,_,dat,_),np(np(det(_),_),_,_,nondat,_)], []) --> [give]. verb(v(give),_,pl,pres,[np(_,_,_,nondat,_),np(np(det(_),_),_,_,nondat,_)], [government(verb,indir_obj,case,dat,nondat)]) --> [give]. verb(v(give),_,pl,pres,[np(np(det(_),_),_,_,nondat,_),np(_,_,_,dat,_)], [lp(dir_obj,indir_obj)]) --> [give]. verb(v(gives),third,sg,pres,[np(_,_,_,dat,_),np(np(det(_),_),_,_,nondat,_)], []) --> [gives]. verb(v(gives),third,sg,pres,[np(_,_,_,nondat,_),np(np(det(_),_),_,_,nondat,_)], [government(verb,indir_obj,case,dat,nondat)]) --> [gives]. verb(v(gives),third,sg,pres,[np(np(det(_),_),_,_,nondat,_),np(_,_,_,dat,_)], [lp(dir_obj,indir_obj)]) --> [gives]. verb(v(gave),_,_,past,[np(_,_,_,dat,_),np(np(det(_),_),_,_,nondat,_)], []) --> [gave]. verb(v(gave),_,_,past,[np(_,_,_,nondat,_),np(np(det(_),_),_,_,nondat,_)], [government(verb,indir_obj,case,dat,nondat)]) --> [gave]. verb(v(gave),_,_,past,[np(np(det(_),_),_,_,nondat,_),np(_,_,_,dat,_)], [lp(dir_obj,indir_obj)]) --> [gave]. verb(v(make),first,sg,pres,[np(np(det(_),_),_,_,nondat,_)],[]) --> [make]. verb(v(make),_,pl,pres,[np(np(det(_),_),_,_,nondat,_)],[]) --> [make]. verb(v(makes),third,sg,pres,[np(np(det(_),_),_,_,nondat,_)],[]) --> [makes]. verb(v(made),_,_,past,[np(np(det(_),_),_,_,nondat,_)],[]) --> [made]. verb(v(make),first,sg,pres,[np(_,_,_,dat,_),advp(_)],[]) --> [make]. verb(v(make),first,sg,pres,[np(_,_,_,nondat,_),advp(_)], [government(verb,indir_obj,case,dat,nondat)]) --> [make]. verb(v(make),second,sg,pres,[np(_,_,_,dat,_),advp(_)],[]) --> [make]. verb(v(make),second,sg,pres,[np(_,_,_,nondat,_),advp(_)], [government(verb,indir_obj,case,dat,nondat)]) --> [make]. verb(v(make),_,pl,pres,[np(_,_,_,dat,_),advp(_)],[]) --> [make]. verb(v(make),_,pl,pres,[np(_,_,_,nondat,_),advp(_)], [government(verb,indir_obj,case,dat,nondat)]) --> [make]. verb(v(makes),third,sg,pres,[np(_,_,_,dat,_),advp(_)],[]) --> [makes]. verb(v(makes),third,sg,pres,[np(_,_,_,nondat,_),advp(_)], [government(verb,indir_obj,case,dat,nondat)]) --> [makes]. verb(v(made),_,_,past,[np(_,_,_,dat,_),advp(_)],[]) --> [made]. verb(v(made),_,_,past,[np(_,_,_,nondat,_),advp(_)], [government(verb,indir_obj,case,dat,nondat)]) --> [made]. part(part(sleep),[]) --> [sleep]. part(part(loving),[np(_,_,_,dat,_)]) --> [loving]. part(part(giving),[np(_,_,_,dat,_),np(_,_,_,nondat,_)]) --> [giving]. part(part(making),[np(_,_,_,dat,_)]) --> [making]. part(part(making),[np(_,_,_,dat,_),advp(_)]) --> [making]. ppron(ppron(i),first,sg,nondat) --> [i]. ppron(ppron(you),second,_,_) --> [you]. ppron(ppron(he),third,sg,nondat) --> [he]. ppron(ppron(she),third,sg,nondat) --> [she]. ppron(ppron(it),third,sg,_) --> [it]. ppron(ppron(we),first,pl,nondat) --> [we]. ppron(ppron(they),third,pl,nondat) --> [they]. ppron(ppron(me),first,sg,dat) --> [me]. ppron(ppron(him),third,sg,dat) --> [him]. ppron(ppron(her),third,sg,dat) --> [her]. ppron(ppron(us),first,pl,dat) --> [us]. ppron(ppron(them),third,pl,dat) --> [them]. % grammar rules nbar(nbar(N),Num) --> n(N,Num). nbar(nbar(Adj,N),Num) --> adj(Adj),n(N,Num). np(np(Det,Nbar),third,Num,_,[]) --> det(Det,Num),nbar(Nbar,Num). np(np(Ppron),Pers,Num,Case,[]) --> ppron(Ppron,Pers,Num,Case). vp(vp(Cop,Advp),Pers,Num,Tense,[]) --> cop(Cop,Pers,Num,Tense), advp(Advp). vp(vp(Cop,Np),Pers,Num,Tense,[]) --> cop(Cop,Pers,Num,Tense), np(Np,_,_,dat,_). vp(vp(Vbar),Pers,Num,Tense,Errors) --> vbar(Vbar,Pers,Num,Tense,Errors). vbar(vbar(V0),Pers,Num,Tense,Errors) --> verb(V0,Pers,Num,Tense,[],Errors). vbar(vbar(V0,S1),Pers,Num,Tense,Errors) --> verb(V0,Pers,Num,Tense,[C1],Errors),C1, {arg(1,C1,S1)}. vbar(vbar(V0,S1,S2),Pers,Num,Tense,Errors) --> verb(V0,Pers,Num,Tense,[C1,C2],Errors),C1,C2, {arg(1,C1,S1),arg(1,C2,S2)}. advp(advp(Advp)) --> adj(Advp). advp(advp(Advp)) --> part(Advp,[]). advp(advp(Advp,S1)) --> part(Advp,[C1]),C1,{arg(1,C1,S1)}. advp(advp(Advp,S1,S2)) --> part(Advp,[C1,C2]),C1,C2,{arg(1,C1,S1),arg(1,C2,S2)}. s(s(Np,Vp),Tense,Errors) --> % S-V-agreement ok np(Np,Pers,Num,nondat,NPerrors), vp(Vp,Pers,Num,Tense,VPerrors), {append(NPerrors,VPerrors,Errors)}. s(s(Np,Vp),Tense,Errors) --> % S-V-agreement person violated np(Np,Pers1,Num,nondat,NPerrors), vp(Vp,Pers2,Num,Tense,VPerrors), {Pers1\=Pers2, append([agree('noun phrase','verb phrase', person,Pers1,Pers2)|NPerrors],VPerrors,Errors)}. s(s(Np,Vp),Tense,Errors) --> % S-V-agreement number violated np(Np,Pers,Num1,nondat,NPerrors), vp(Vp,Pers,Num2,Tense,VPerrors), {Num1\=Num2, append([agree('noun phrase', 'verb phrase', number,Num1,Num2)|NPerrors],VPerrors,Errors)}. s(s(Np,Vp),Tense,Errors) --> % S-V-agreement person and number violated np(Np,Pers1,Num1,nondat,NPerrors), vp(Vp,Pers2,Num2,Tense,VPerrors), {Pers1\=Pers2, Num1\=Num2, append([agree('noun phrase', 'verb phrase',person,Pers1,Pers2), agree('noun phrase', 'verb phrase', number,Num1,Num2)|NPerrors],VPerrors,Errors)}. s(Sentence,Structure,Tense,Errors) :- s(Structure,Tense,Errors,Sentence,[ ]). exercise(grammar,'Answer the following questions:'). item(grammar,1,'What does the man love?'). item(grammar,2,'What did the woman make?'). %%% launches the demo-server on port 8000 :- use_module(tutor_server_grammar). :- nl. :- write_ln('server launched on port 8000'). :- nl. :- server(8000).