/* Copyright 1986-2020 David H. D. Warren and Fernando C. N. Pereira Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ % generated: 19 November 1989 % option(s): % % chat_parser % % Fernando C. N. Pereira and David H. D. Warren top:- chat_parser. go:- statistics(runtime,[_,_]), chat_parser, statistics(runtime,[_,T]), write('execution time is '),write(T), write(milliseconds). chat_parser :- my_string(X), determinate_say(X,_), fail. chat_parser. % query set my_string([what,rivers,are,there,?]). my_string([does,afghanistan,border,china,?]). my_string([what,is,the,capital,of,upper_volta,?]). my_string([where,is,the,largest,country,?]). my_string([which,country,'~',s,capital,is,london,?]). my_string([which,countries,are,european,?]). my_string([how,large,is,the,smallest,american,country,?]). my_string([what,is,the,ocean,that,borders,african,countries, and,that,borders,asian,countries,?]). my_string([what,are,the,capitals,of,the,countries,bordering,the,baltic,?]). my_string([which,countries,are,bordered,by,two,seas,?]). my_string([how,many,countries,does,the,danube,flow,through,?]). my_string([what,is,the,total,area,of,countries,south,of,the,equator, and,not,in,australasia,?]). my_string([what,is,the,average,area,of,the,countries,in,each,continent,?]). my_string([is,there,more,than,one,country,in,each,continent,?]). my_string([is,there,some,ocean,that,does,not,border,any,country,?]). my_string([what,are,the,countries,from,which,a,river,flows, into,the,black_sea,?]). % determinate_say determinate_say(X,Y) :- say(X,Y), !. %----------------------------------------------------------------------------- % % xgrun % %----------------------------------------------------------------------------- terminal(T,S,S,x(_,terminal,T,X),X). terminal(T,[T|S],S,X,X) :- gap(X). gap(x(gap,_,_,_)). gap([]). virtual(NT,x(_,nonterminal,NT,X),X). %---------------------------------------------------------------------------- % % clotab % %---------------------------------------------------------------------------- % normal form masks is_pp(#(1,_,_,_)). is_pred(#(_,1,_,_)). is_trace(#(_,_,1,_)). is_adv(#(_,_,_,1)). trace1(#(_,_,1,_),#(0,0,0,0)). trace1(#(0,0,1,0)). adv(#(0,0,0,1)). empty(#(0,0,0,0)). np_all(#(1,1,1,0)). s_all(#(1,0,1,1)). np_no_trace(#(1,1,0,0)). % mask operations myplus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :- or(B1,C1,D1), or(B2,C2,D2), or(B3,C3,D3), or(B4,C4,D4). minus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :- anot(B1,C1,D1), anot(B2,C2,D2), anot(B3,C3,D3), anot(B4,C4,D4). or(1,_,1). or(0,1,1). or(0,0,0). anot(X,0,X). anot(X,1,0). % noun phrase position features role(subj,_,#(1,0,0)). role(compl,_,#(0,_,_)). role(undef,main,#(_,0,_)). role(undef,aux,#(0,_,_)). role(undef,decl,_). role(nil,_,_). subj_case(#(1,0,0)). verb_case(#(0,1,0)). prep_case(#(0,0,1)). compl_case(#(0,_,_)). %---------------------------------------------------------------------------- % % newg % %---------------------------------------------------------------------------- say(X,Y) :- sentence(Y,X,[],[],[]). sentence(B,C,D,E,F) :- declarative(B,C,G,E,H), terminator(.,G,D,H,F). sentence(B,C,D,E,F) :- wh_question(B,C,G,E,H), terminator(?,G,D,H,F). sentence(B,C,D,E,F) :- topic(C,G,E,H), wh_question(B,G,I,H,J), terminator(?,I,D,J,F). sentence(B,C,D,E,F) :- yn_question(B,C,G,E,H), terminator(?,G,D,H,F). sentence(B,C,D,E,F) :- imperative(B,C,G,E,H), terminator(!,G,D,H,F). pp(B,C,D,E,F,F,G,H) :- virtual(pp(B,C,D,E),G,H). pp(pp(B,C),D,E,F,G,H,I,J) :- prep(B,G,K,I,L), prep_case(M), np(C,N,M,O,D,E,F,K,H,L,J). topic(B,C,D,x(gap,nonterminal,pp(E,compl,F,G),H)) :- pp(E,compl,F,G,B,I,D,J), opt_comma(I,C,J,H). opt_comma(B,C,D,E) :- ~(',',B,C,D,E). opt_comma(B,B,C,C). declarative(decl(B),C,D,E,F) :- s(B,G,C,D,E,F). wh_question(whq(B,C),D,E,F,G) :- variable_q(B,H,I,J,D,K,F,L), question(I,J,C,K,E,L,G). np(B,C,D,E,F,G,H,I,I,J,K) :- virtual(np(B,C,D,E,F,G,H),J,K). np(np(B,C,[]),B,D,def,E,F,G,H,I,J,K) :- is_pp(F), pers_pron(C,B,L,H,I,J,K), empty(G), role(L,decl,D). np(np(B,C,D),B,E,F,G,H,I,J,K,L,M) :- is_pp(H), np_head(C,B,F+N,O,D,J,P,L,Q), np_all(R), np_compls(N,B,G,O,R,I,P,K,Q,M). np(part(B,C),3+D,E,indef,F,G,H,I,J,K,L) :- is_pp(G), determiner(B,D,indef,I,M,K,N), ~(of,M,O,N,P), s_all(Q), prep_case(R), np(C,3+plu,R,def,F,Q,H,O,J,P,L). variable_q(B,C,D,E,F,G,H,x(gap,nonterminal,np(I,C,E,J,K,L,M),N)) :- whq(B,C,I,D,F,G,H,N), trace1(L,M). variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal,pp(pp(H,I),compl,J,K),L)) :- prep(H,E,M,G,N), whq(B,C,I,O,M,F,N,L), trace1(J,K), compl_case(D). variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal, adv_phrase(pp(H,np(C,np_head(int_det(B),[],I),[])),J,K),L)) :- context_pron(H,I,E,F,G,L), trace1(J,K), verb_case(D). variable_q(B,C,compl,D,E,F,G, x(gap,nonterminal,predicate(adj,value(H,wh(B)),I),J)) :- ~(how,E,K,G,L), adj(quant,H,K,F,L,J), empty(I), verb_case(D). adv_phrase(B,C,D,E,E,F,G) :- virtual(adv_phrase(B,C,D),F,G). adv_phrase(pp(B,C),D,E,F,G,H,I) :- loc_pred(B,F,J,H,K), pp(pp(prep(of),C),compl,D,E,J,G,K,I). predicate(B,C,D,E,E,F,G) :- virtual(predicate(B,C,D),F,G). predicate(B,C,D,E,F,G,H) :- adj_phrase(C,D,E,F,G,H). predicate(neg,B,C,D,E,F,G) :- s_all(H), pp(B,compl,H,C,D,E,F,G). predicate(B,C,D,E,F,G,H) :- s_all(I), adv_phrase(C,I,D,E,F,G,H). whq(B,C,D,undef,E,F,G,H) :- int_det(B,C,E,I,G,J), s_all(K), np(D,C,L,M,subj,K,N,I,F,J,H). whq(B,3+C,np(3+C,wh(B),[]),D,E,F,G,H) :- int_pron(D,E,F,G,H). int_det(B,3+C,D,E,F,G) :- whose(B,C,D,E,F,G). int_det(B,3+C,D,E,F,G) :- int_art(B,C,D,E,F,G). gen_marker(B,B,C,D) :- virtual(gen_marker,C,D). gen_marker(B,C,D,E) :- ~('~',B,F,D,G), an_s(F,C,G,E). whose(B,C,D,E,F,x(nogap,nonterminal,np_head0(wh(B),C,proper), x(nogap,nonterminal,gen_marker,G))) :- ~(whose,D,E,F,G). question(B,C,D,E,F,G,H) :- subj_question(B), role(subj,I,C), s(D,J,E,F,G,H). question(B,C,D,E,F,G,H) :- fronted_verb(B,C,E,I,G,J), s(D,K,I,F,J,H). det(B,C,D,E,E,F,G) :- virtual(det(B,C,D),F,G). det(det(B),C,D,E,F,G,H) :- terminal(I,E,F,G,H), det(I,C,B,D). det(generic,B,generic,C,C,D,D). int_art(B,C,D,E,F,x(nogap,nonterminal,det(G,C,def),H)) :- int_art(B,C,G,D,E,F,H). subj_question(subj). subj_question(undef). yn_question(q(B),C,D,E,F) :- fronted_verb(nil,G,C,H,E,I), s(B,J,H,D,I,F). verb_form(B,C,D,E,F,F,G,H) :- virtual(verb_form(B,C,D,E),G,H). verb_form(B,C,D,E,F,G,H,I) :- terminal(J,F,G,H,I), verb_form(J,B,C,D). neg(B,C,D,D,E,F) :- virtual(neg(B,C),E,F). neg(aux+B,neg,C,D,E,F) :- ~(not,C,D,E,F). neg(B,pos,C,C,D,D). fronted_verb(B,C,D,E,F,x(gap,nonterminal,verb_form(G,H,I,J), x(nogap,nonterminal,neg(K,L),M))) :- verb_form(G,H,I,N,D,O,F,P), verb_type(G,aux+Q), role(B,J,C), neg(R,L,O,E,P,M). imperative(imp(B),C,D,E,F) :- imperative_verb(C,G,E,H), s(B,I,G,D,H,F). imperative_verb(B,C,D,x(nogap,terminal,you,x(nogap,nonterminal, verb_form(E,imp+fin,2+sin,main),F))) :- verb_form(E,inf,G,H,B,C,D,F). s(s(B,C,D,E),F,G,H,I,J) :- subj(B,K,L,G,M,I,N), verb(C,K,L,O,M,P,N,Q), empty(R), s_all(S), verb_args(L,O,D,R,T,P,U,Q,V), minus(S,T,W), myplus(S,T,X), verb_mods(E,W,X,F,U,H,V,J). subj(there,B,C+be,D,E,F,G) :- ~(there,D,E,F,G). subj(B,C,D,E,F,G,H) :- s_all(I), subj_case(J), np(B,C,J,K,subj,I,L,E,F,G,H). np_head(B,C,D,E,F,G,H,I,J) :- np_head0(K,L,M,G,N,I,O), possessive(K,L,M,P,P,B,C,D,E,F,N,H,O,J). np_head0(B,C,D,E,E,F,G) :- virtual(np_head0(B,C,D),F,G). np_head0(name(B),3+sin,def+proper,C,D,E,F) :- name(B,C,D,E,F). np_head0(np_head(B,C,D),3+E,F+common,G,H,I,J) :- determiner(B,E,F,G,K,I,L), adjs(C,K,M,L,N), noun(D,E,M,H,N,J). np_head0(B,C,def+proper,D,E,F,x(nogap,nonterminal,gen_marker,G)) :- poss_pron(B,C,D,E,F,G). np_head0(np_head(B,[],C),3+sin,indef+common,D,E,F,G) :- quantifier_pron(B,C,D,E,F,G). np_compls(proper,B,C,[],D,E,F,F,G,G) :- empty(E). np_compls(common,B,C,D,E,F,G,H,I,J) :- np_all(K), np_mods(B,C,L,D,E,M,K,N,G,O,I,P), relative(B,L,M,N,F,O,H,P,J). possessive(B,C,D,[],E,F,G,H,I,J,K,L,M,N) :- gen_case(K,O,M,P), np_head0(Q,R,S,O,T,P,U), possessive(Q,R,S,V,[pp(poss,np(C,B,E))|V],F,G,H,I,J,T,L,U,N). possessive(B,C,D,E,F,B,C,D,E,F,G,G,H,H). gen_case(B,C,D,x(nogap,terminal,the,E)) :- gen_marker(B,C,D,E). an_s(B,C,D,E) :- ~(s,B,C,D,E). an_s(B,B,C,C). determiner(B,C,D,E,F,G,H) :- det(B,C,D,E,F,G,H). determiner(B,C,D,E,F,G,H) :- quant_phrase(B,C,D,E,F,G,H). quant_phrase(quant(B,C),D,E,F,G,H,I) :- quant(B,E,F,J,H,K), number(C,D,J,G,K,I). quant(B,indef,C,D,E,F) :- neg_adv(G,B,C,H,E,I), comp_adv(G,H,J,I,K), ~(than,J,D,K,F). quant(B,indef,C,D,E,F) :- ~(at,C,G,E,H), sup_adv(I,G,D,H,F), sup_op(I,B). quant(the,def,B,C,D,E) :- ~(the,B,C,D,E). quant(same,indef,B,B,C,C). neg_adv(B,not+B,C,D,E,F) :- ~(not,C,D,E,F). neg_adv(B,B,C,C,D,D). sup_op(least,not+less). sup_op(most,not+more). np_mods(B,C,D,[E|F],G,H,I,J,K,L,M,N) :- np_mod(B,C,E,G,O,K,P,M,Q), trace1(R), myplus(R,O,S), minus(G,S,T), myplus(O,G,U), np_mods(B,C,D,F,T,H,U,J,P,L,Q,N). np_mods(B,C,D,D,E,E,F,F,G,G,H,H). np_mod(B,C,D,E,F,G,H,I,J) :- pp(D,C,E,F,G,H,I,J). np_mod(B,C,D,E,F,G,H,I,J) :- reduced_relative(B,D,E,F,G,H,I,J). verb_mods([B|C],D,E,F,G,H,I,J) :- verb_mod(B,D,K,G,L,I,M), trace1(N), myplus(N,K,O), minus(D,O,P), myplus(K,D,Q), verb_mods(C,P,Q,F,L,H,M,J). verb_mods([],B,C,C,D,D,E,E). verb_mod(B,C,D,E,F,G,H) :- adv_phrase(B,C,D,E,F,G,H). verb_mod(B,C,D,E,F,G,H) :- is_adv(C), adverb(B,E,F,G,H), empty(D). verb_mod(B,C,D,E,F,G,H) :- pp(B,compl,C,D,E,F,G,H). adjs([B|C],D,E,F,G) :- pre_adj(B,D,H,F,I), adjs(C,H,E,I,G). adjs([],B,B,C,C). pre_adj(B,C,D,E,F) :- adj(G,B,C,D,E,F). pre_adj(B,C,D,E,F) :- sup_phrase(B,C,D,E,F). sup_phrase(sup(most,B),C,D,E,F) :- sup_adj(B,C,D,E,F). sup_phrase(sup(B,C),D,E,F,G) :- sup_adv(B,D,I,F,J), adj(quant,C,I,E,J,G). comp_phrase(comp(B,C,D),E,F,G,H,I) :- comp(B,C,F,J,H,K), np_no_trace(L), prep_case(M), np(D,N,M,O,compl,L,E,J,G,K,I). comp(B,C,D,E,F,G) :- comp_adv(B,D,H,F,I), adj(quant,C,H,J,I,K), ~(than,J,E,K,G). comp(more,B,C,D,E,F) :- rel_adj(B,C,G,E,H), ~(than,G,D,H,F). comp(same,B,C,D,E,F) :- ~(as,C,G,E,H), adj(quant,B,G,I,H,J), ~(as,I,D,J,F). relative(B,[C],D,E,F,G,H,I,J) :- is_pred(D), rel_conj(B,K,C,F,G,H,I,J). relative(B,[],C,D,D,E,E,F,F). rel_conj(B,C,D,E,F,G,H,I) :- rel(B,J,K,F,L,H,M), rel_rest(B,C,J,D,K,E,L,G,M,I). rel_rest(B,C,D,E,F,G,H,I,J,K) :- conj(C,L,D,M,E,H,N,J,O), rel_conj(B,L,M,G,N,I,O,K). rel_rest(B,C,D,D,E,E,F,F,G,G). rel(B,rel(C,D),E,F,G,H,I) :- myopen(F,J,H,K), variable(B,C,J,L,K,M), s(D,N,L,O,M,P), trace1(Q), minus(N,Q,E), close(O,G,P,I). variable(B,C,D,E,F,x(gap,nonterminal,np(np(B,wh(C),[]),B,G,H,I,J,K),L)) :- ~(that,D,E,F,L), trace1(J,K). variable(B,C,D,E,F,x(gap,nonterminal,np(G,H,I,J,K,L,M),N)) :- wh(C,B,G,H,I,D,E,F,N), trace1(L,M). variable(B,C,D,E,F,x(gap,nonterminal,pp(pp(G,H),compl,I,J),K)) :- prep(G,D,L,F,M), wh(C,B,H,N,O,L,E,M,K), trace1(I,J), compl_case(O). wh(B,C,np(C,wh(B),[]),C,D,E,F,G,H) :- rel_pron(I,E,F,G,H), role(I,decl,D). wh(B,C,np(D,E,[pp(F,G)]),D,H,I,J,K,L) :- np_head0(E,D,M+common,I,N,K,O), prep(F,N,P,O,Q), wh(B,C,G,R,S,P,J,Q,L). wh(B,C,D,E,F,G,H,I,J) :- whose(B,C,G,K,I,L), s_all(M), np(D,E,F,def,subj,M,N,K,H,L,J). reduced_relative(B,C,D,E,F,G,H,I) :- is_pred(D), reduced_rel_conj(B,J,C,E,F,G,H,I). reduced_rel_conj(B,C,D,E,F,G,H,I) :- reduced_rel(B,J,K,F,L,H,M), reduced_rel_rest(B,C,J,D,K,E,L,G,M,I). reduced_rel_rest(B,C,D,E,F,G,H,I,J,K) :- conj(C,L,D,M,E,H,N,J,O), reduced_rel_conj(B,L,M,G,N,I,O,K). reduced_rel_rest(B,C,D,D,E,E,F,F,G,G). reduced_rel(B,reduced_rel(C,D),E,F,G,H,I) :- myopen(F,J,H,K), reduced_wh(B,C,J,L,K,M), s(D,N,L,O,M,P), trace1(Q), minus(N,Q,E), close(O,G,P,I). reduced_wh(B,C,D,E,F,x(nogap,nonterminal, np(np(B,wh(C),[]),B,G,H,I,J,K),x(nogap,nonterminal, verb_form(be,pres+fin,B,main),x(nogap,nonterminal, neg(L,M),x(nogap,nonterminal,predicate(M,N,O),P))))) :- neg(Q,M,D,R,F,S), predicate(M,N,O,R,E,S,P), trace1(J,K), subj_case(G). reduced_wh(B,C,D,E,F,x(nogap,nonterminal, np(np(B,wh(C),[]),B,G,H,I,J,K),x(nogap,nonterminal, verb(L,M,N,O),P))) :- participle(L,N,O,D,E,F,P), trace1(J,K), subj_case(G). reduced_wh(B,C,D,E,F,x(nogap,nonterminal, np(G,H,I,J,K,L,M),x(gap,nonterminal, np(np(B,wh(C),[]),B,N,O,P,Q,R),S))) :- s_all(T), subj_case(I), verb_case(N), np(G,H,U,J,subj,T,V,D,E,F,S), trace1(L,M), trace1(Q,R). verb(B,C,D,E,F,F,G,H) :- virtual(verb(B,C,D,E),G,H). verb(verb(B,C,D+fin,E,F),G,H,C,I,J,K,L) :- verb_form(M,D+fin,G,N,I,O,K,P), verb_type(M,Q), neg(Q,F,O,R,P,S), rest_verb(N,M,B,C,E,R,J,S,L), verb_type(B,H). rest_verb(aux,have,B,C,[perf|D],E,F,G,H) :- verb_form(I,past+part,J,K,E,L,G,M), have(I,B,C,D,L,F,M,H). rest_verb(aux,be,B,C,D,E,F,G,H) :- verb_form(I,J,K,L,E,M,G,N), be(J,I,B,C,D,M,F,N,H). rest_verb(aux,do,B,active,[],C,D,E,F) :- verb_form(B,inf,G,H,C,D,E,F). rest_verb(main,B,B,active,[],C,C,D,D). have(be,B,C,D,E,F,G,H) :- verb_form(I,J,K,L,E,M,G,N), be(J,I,B,C,D,M,F,N,H). have(B,B,active,[],C,C,D,D). be(past+part,B,B,passive,[],C,C,D,D). be(pres+part,B,C,D,[prog],E,F,G,H) :- passive(B,C,D,E,F,G,H). passive(be,B,passive,C,D,E,F) :- verb_form(B,past+part,G,H,C,D,E,F), verb_type(B,I), passive(I). passive(B,B,active,C,C,D,D). participle(verb(B,C,inf,D,E),F,C,G,H,I,J) :- neg(K,E,G,L,I,M), verb_form(B,N,O,P,L,H,M,J), participle(N,C,D), verb_type(B,F). passive(B+trans). passive(B+ditrans). participle(pres+part,active,[prog]). participle(past+part,passive,[]). close(B,B,C,D) :- virtual(close,C,D). myopen(B,B,C,x(gap,nonterminal,close,C)). verb_args(B+C,D,E,F,G,H,I,J,K) :- advs(E,L,M,H,N,J,O), verb_args(C,D,L,F,G,N,I,O,K). verb_args(trans,active,[arg(dir,B)],C,D,E,F,G,H) :- verb_arg(np,B,D,E,F,G,H). verb_args(ditrans,B,[arg(C,D)|E],F,G,H,I,J,K) :- verb_arg(np,D,L,H,M,J,N), object(C,E,L,G,M,I,N,K). verb_args(be,B,[void],C,C,D,E,F,G) :- terminal(there,D,E,F,G). verb_args(be,B,[arg(predicate,C)],D,E,F,G,H,I) :- pred_conj(J,C,E,F,G,H,I). verb_args(be,B,[arg(dir,C)],D,E,F,G,H,I) :- verb_arg(np,C,E,F,G,H,I). verb_args(have,active,[arg(dir,B)],C,D,E,F,G,H) :- verb_arg(np,B,D,E,F,G,H). verb_args(B,C,[],D,D,E,E,F,F) :- no_args(B). object(B,C,D,E,F,G,H,I) :- adv(J), minus(J,D,K), advs(C,L,K,F,M,H,N), obj(B,L,D,E,M,G,N,I). obj(ind,[arg(dir,B)],C,D,E,F,G,H) :- verb_arg(np,B,D,E,F,G,H). obj(dir,[],B,B,C,C,D,D). pred_conj(B,C,D,E,F,G,H) :- predicate(I,J,K,E,L,G,M), pred_rest(B,J,C,K,D,L,F,M,H). pred_rest(B,C,D,E,F,G,H,I,J) :- conj(B,K,C,L,D,G,M,I,N), pred_conj(K,L,F,M,H,N,J). pred_rest(B,C,C,D,D,E,E,F,F). verb_arg(np,B,C,D,E,F,G) :- s_all(H), verb_case(I), np(B,J,I,K,compl,H,C,D,E,F,G). advs([B|C],D,E,F,G,H,I) :- is_adv(E), adverb(B,F,J,H,K), advs(C,D,E,J,G,K,I). advs(B,B,C,D,D,E,E). adj_phrase(B,C,D,E,F,G) :- adj(H,B,D,E,F,G), empty(C). adj_phrase(B,C,D,E,F,G) :- comp_phrase(B,C,D,E,F,G). no_args(trans). no_args(ditrans). no_args(intrans). conj(conj(B,C),conj(B,D),E,F,conj(B,E,F),G,H,I,J) :- conj(B,C,D,G,H,I,J). noun(B,C,D,E,F,G) :- terminal(H,D,E,F,G), noun_form(H,B,C). adj(B,adj(C),D,E,F,G) :- terminal(C,D,E,F,G), adj(C,B). prep(prep(B),C,D,E,F) :- terminal(B,C,D,E,F), prep(B). rel_adj(adj(B),C,D,E,F) :- terminal(G,C,D,E,F), rel_adj(G,B). sup_adj(adj(B),C,D,E,F) :- terminal(G,C,D,E,F), sup_adj(G,B). comp_adv(less,B,C,D,E) :- ~(less,B,C,D,E). comp_adv(more,B,C,D,E) :- ~(more,B,C,D,E). sup_adv(least,B,C,D,E) :- ~(least,B,C,D,E). sup_adv(most,B,C,D,E) :- ~(most,B,C,D,E). rel_pron(B,C,D,E,F) :- terminal(G,C,D,E,F), rel_pron(G,B). name(B,C,D,E,F) :- opt_the(C,G,E,H), terminal(B,G,D,H,F), name(B). int_art(B,plu,quant(same,wh(B)),C,D,E,F) :- ~(how,C,G,E,H), ~(many,G,D,H,F). int_art(B,C,D,E,F,G,H) :- terminal(I,E,F,G,H), int_art(I,B,C,D). int_pron(B,C,D,E,F) :- terminal(G,C,D,E,F), int_pron(G,B). adverb(adv(B),C,D,E,F) :- terminal(B,C,D,E,F), adverb(B). poss_pron(pronoun(B),C+D,E,F,G,H) :- terminal(I,E,F,G,H), poss_pron(I,B,C,D). pers_pron(pronoun(B),C+D,E,F,G,H,I) :- terminal(J,F,G,H,I), pers_pron(J,B,C,D,E). quantifier_pron(B,C,D,E,F,G) :- terminal(H,D,E,F,G), quantifier_pron(H,B,C). context_pron(prep(in),place,B,C,D,E) :- ~(where,B,C,D,E). context_pron(prep(at),time,B,C,D,E) :- ~(when,B,C,D,E). number(nb(B),C,D,E,F,G) :- terminal(H,D,E,F,G), number(H,B,C). terminator(B,C,D,E,F) :- terminal(G,C,D,E,F), terminator(G,B). opt_the(B,B,C,C). opt_the(B,C,D,E) :- ~(the,B,C,D,E). conj(B,list,list,C,D,E,F) :- terminal(',',C,D,E,F). conj(B,list,'end',C,D,E,F) :- terminal(B,C,D,E,F), conj(B). loc_pred(B,C,D,E,F) :- terminal(G,C,D,E,F), loc_pred(G,B). ~(B,C,D,E,F) :- terminal(B,C,D,E,F), ~(B). %---------------------------------------------------------------------------- % % newdic % %---------------------------------------------------------------------------- word(Word) :- ~(Word). word(Word) :- conj(Word). word(Word) :- adverb(Word). word(Word) :- sup_adj(Word,_). word(Word) :- rel_adj(Word,_). word(Word) :- adj(Word,_). word(Word) :- name(Word). word(Word) :- terminator(Word,_). word(Word) :- pers_pron(Word,_,_,_,_). word(Word) :- poss_pron(Word,_,_,_). word(Word) :- rel_pron(Word,_). word(Word) :- verb_form(Word,_,_,_). word(Word) :- noun_form(Word,_,_). word(Word) :- prep(Word). word(Word) :- quantifier_pron(Word,_,_). word(Word) :- number(Word,_,_). word(Word) :- det(Word,_,_,_). word(Word) :- int_art(Word,_,_,_). word(Word) :- int_pron(Word,_). word(Word) :- loc_pred(Word,_). ~(how). ~(whose). ~(there). ~(of). ~('~'). % use ~ instead of ' to help assembler ~(','). ~(s). ~(than). ~(at). ~(the). ~(not). ~(as). ~(that). ~(less). ~(more). ~(least). ~(most). ~(many). ~(where). ~(when). conj(and). conj(or). int_pron(what,undef). int_pron(which,undef). int_pron(who,subj). int_pron(whom,compl). int_art(what,X,_,int_det(X)). int_art(which,X,_,int_det(X)). det(the,No,the(No),def). det(a,sin,a,indef). det(an,sin,a,indef). det(every,sin,every,indef). det(some,_,some,indef). det(any,_,any,indef). det(all,plu,all,indef). det(each,sin,each,indef). det(no,_,no,indef). number(W,I,Nb) :- tr_number(W,I), ag_number(I,Nb). tr_number(nb(I),I). tr_number(one,1). tr_number(two,2). tr_number(three,3). tr_number(four,4). tr_number(five,5). tr_number(six,6). tr_number(seven,7). tr_number(eight,8). tr_number(nine,9). tr_number(ten,10). ag_number(1,sin). ag_number(N,plu) :- N>1. quantifier_pron(everybody,every,person). quantifier_pron(everyone,every,person). quantifier_pron(everything,every,thing). quantifier_pron(somebody,some,person). quantifier_pron(someone,some,person). quantifier_pron(something,some,thing). quantifier_pron(anybody,any,person). quantifier_pron(anyone,any,person). quantifier_pron(anything,any,thing). quantifier_pron(nobody,no,person). quantifier_pron(nothing,no,thing). prep(as). prep(at). prep(of). prep(to). prep(by). prep(with). prep(in). prep(on). prep(from). prep(into). prep(through). noun_form(Plu,Sin,plu) :- noun_plu(Plu,Sin). noun_form(Sin,Sin,sin) :- noun_sin(Sin). noun_form(proportion,proportion,_). noun_form(percentage,percentage,_). root_form(1+sin). root_form(2+_). root_form(1+plu). root_form(3+plu). verb_root(be). verb_root(have). verb_root(do). verb_root(border). verb_root(contain). verb_root(drain). verb_root(exceed). verb_root(flow). verb_root(rise). regular_pres(have). regular_pres(do). regular_pres(rise). regular_pres(border). regular_pres(contain). regular_pres(drain). regular_pres(exceed). regular_pres(flow). regular_past(had,have). regular_past(bordered,border). regular_past(contained,contain). regular_past(drained,drain). regular_past(exceeded,exceed). regular_past(flowed,flow). rel_pron(who,subj). rel_pron(whom,compl). rel_pron(which,undef). poss_pron(my,_,1,sin). poss_pron(your,_,2,_). poss_pron(his,masc,3,sin). poss_pron(her,fem,3,sin). poss_pron(its,neut,3,sin). poss_pron(our,_,1,plu). poss_pron(their,_,3,plu). pers_pron(i,_,1,sin,subj). pers_pron(you,_,2,_,_). pers_pron(he,masc,3,sin,subj). pers_pron(she,fem,3,sin,subj). pers_pron(it,neut,3,sin,_). pers_pron(we,_,1,plu,subj). pers_pron(them,_,3,plu,subj). pers_pron(me,_,1,sin,compl(_)). pers_pron(him,masc,3,sin,compl(_)). pers_pron(her,fem,3,sin,compl(_)). pers_pron(us,_,1,plu,compl(_)). pers_pron(them,_,3,plu,compl(_)). terminator(.,_). terminator(?,?). terminator(!,!). name(_). % =========================================================================== % specialised dictionary loc_pred(east,prep(eastof)). loc_pred(west,prep(westof)). loc_pred(north,prep(northof)). loc_pred(south,prep(southof)). adj(minimum,restr). adj(maximum,restr). adj(average,restr). adj(total,restr). adj(african,restr). adj(american,restr). adj(asian,restr). adj(european,restr). adj(great,quant). adj(big,quant). adj(small,quant). adj(large,quant). adj(old,quant). adj(new,quant). adj(populous,quant). rel_adj(greater,great). rel_adj(less,small). rel_adj(bigger,big). rel_adj(smaller,small). rel_adj(larger,large). rel_adj(older,old). rel_adj(newer,new). sup_adj(biggest,big). sup_adj(smallest,small). sup_adj(largest,large). sup_adj(oldest,old). sup_adj(newest,new). noun_sin(average). noun_sin(total). noun_sin(sum). noun_sin(degree). noun_sin(sqmile). noun_sin(ksqmile). noun_sin(thousand). noun_sin(million). noun_sin(time). noun_sin(place). noun_sin(area). noun_sin(capital). noun_sin(city). noun_sin(continent). noun_sin(country). noun_sin(latitude). noun_sin(longitude). noun_sin(ocean). noun_sin(person). noun_sin(population). noun_sin(region). noun_sin(river). noun_sin(sea). noun_sin(seamass). noun_sin(number). noun_plu(averages,average). noun_plu(totals,total). noun_plu(sums,sum). noun_plu(degrees,degree). noun_plu(sqmiles,sqmile). noun_plu(ksqmiles,ksqmile). noun_plu(million,million). noun_plu(thousand,thousand). noun_plu(times,time). noun_plu(places,place). noun_plu(areas,area). noun_plu(capitals,capital). noun_plu(cities,city). noun_plu(continents,continent). noun_plu(countries,country). noun_plu(latitudes,latitude). noun_plu(longitudes,longitude). noun_plu(oceans,ocean). noun_plu(persons,person). noun_plu(people,person). noun_plu(populations,population). noun_plu(regions,region). noun_plu(rivers,river). noun_plu(seas,sea). noun_plu(seamasses,seamass). noun_plu(numbers,number). verb_form(V,V,inf,_) :- verb_root(V). verb_form(V,V,pres+fin,Agmt) :- regular_pres(V), root_form(Agmt), verb_root(V). verb_form(Past,Root,past+_,_) :- regular_past(Past,Root). verb_form(am,be,pres+fin,1+sin). verb_form(are,be,pres+fin,2+sin). verb_form(is,be,pres+fin,3+sin). verb_form(are,be,pres+fin,_+plu). verb_form(was,be,past+fin,1+sin). verb_form(were,be,past+fin,2+sin). verb_form(was,be,past+fin,3+sin). verb_form(were,be,past+fin,_+plu). verb_form(been,be,past+part,_). verb_form(being,be,pres+part,_). verb_form(has,have,pres+fin,3+sin). verb_form(having,have,pres+part,_). verb_form(does,do,pres+fin,3+sin). verb_form(did,do,past+fin,_). verb_form(doing,do,pres+part,_). verb_form(done,do,past+part,_). verb_form(flows,flow,pres+fin,3+sin). verb_form(flowing,flow,pres+part,_). verb_form(rises,rise,pres+fin,3+sin). verb_form(rose,rise,past+fin,_). verb_form(risen,rise,past+part,_). verb_form(borders,border,pres+fin,3+sin). verb_form(bordering,border,pres+part,_). verb_form(contains,contain,pres+fin,3+sin). verb_form(containing,contain,pres+part,_). verb_form(drains,drain,pres+fin,3+sin). verb_form(draining,drain,pres+part,_). verb_form(exceeds,exceed,pres+fin,3+sin). verb_form(exceeding,exceed,pres+part,_). verb_type(have,aux+have). verb_type(be,aux+be). verb_type(do,aux+ditrans). verb_type(rise,main+intrans). verb_type(border,main+trans). verb_type(contain,main+trans). verb_type(drain,main+intrans). verb_type(exceed,main+trans). verb_type(flow,main+intrans). adverb(yesterday). adverb(tomorrow).