home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / b / binprolog / !BinPro330 / progs / chat < prev    next >
Encoding:
Text File  |  1994-03-31  |  24.2 KB  |  1,182 lines

  1. % generated: 19 November 1989
  2. % option(s): 
  3. %
  4. %  chat_parser
  5. %
  6. %  Fernando C. N. Pereira and David H. D. Warren
  7.  
  8. % changed open -> o_p_e_n to avoid name clash with Quintus builtin P.Tarau
  9.  
  10. test(time-T):-statistics(runtime,_),chat_parser,statistics(runtime,[_,T]).
  11.  
  12. chat_parser :- string(X),
  13.                determinate_say(X,_),
  14.                fail.
  15. chat_parser.
  16.  
  17.  
  18. %  query set
  19.  
  20. string([what,rivers,are,there,?]).
  21. string([does,afghanistan,border,china,?]).
  22. string([what,is,the,capital,of,upper_volta,?]).
  23. string([where,is,the,largest,country,?]).
  24. string([which,country,'quote',s,capital,is,london,?]).
  25. string([which,countries,are,european,?]).
  26. string([how,large,is,the,smallest,american,country,?]).
  27. string([what,is,the,ocean,that,borders,african,countries,
  28.     and,that,borders,asian,countries,?]).
  29. string([what,are,the,capitals,of,the,countries,bordering,the,baltic,?]).
  30. string([which,countries,are,bordered,by,two,seas,?]).
  31. string([how,many,countries,does,the,danube,flow,through,?]).
  32. string([what,is,the,total,area,of,countries,south,of,the,equator,
  33.     and,not,in,australasia,?]).
  34. string([what,is,the,average,area,of,the,countries,in,each,continent,?]).
  35. string([is,there,more,than,one,country,in,each,continent,?]).
  36. string([is,there,some,ocean,that,does,not,border,any,country,?]).
  37. string([what,are,the,countries,from,which,a,river,flows,
  38.     into,the,black_sea,?]).
  39.  
  40.  
  41. %  determinate_say
  42.  
  43. determinate_say(X,Y) :- 
  44.    say(X,Y), !.
  45.  
  46.  
  47. %-----------------------------------------------------------------------------
  48. %
  49. %  xgrun
  50. %
  51. %-----------------------------------------------------------------------------
  52.  
  53. terminal(T,S,S,x(_,terminal,T,X),X).
  54. terminal(T,[T|S],S,X,X) :-
  55.    gap(X).
  56.  
  57. gap(x(gap,_,_,_)).
  58. gap([]).
  59.  
  60. virtual(NT,x(_,nonterminal,NT,X),X).
  61.  
  62.  
  63. %----------------------------------------------------------------------------
  64. %
  65. %  clotab
  66. %
  67. %----------------------------------------------------------------------------
  68.  
  69. % normal form masks
  70.  
  71. is_pp(#(1,_,_,_)).
  72.  
  73. is_pred(#(_,1,_,_)).
  74.  
  75. is_chat_trace(#(_,_,1,_)).
  76.  
  77. is_adv(#(_,_,_,1)).
  78.  
  79. chat_trace(#(_,_,1,_),#(0,0,0,0)).
  80.  
  81. chat_trace(#(0,0,1,0)).
  82.  
  83. adv(#(0,0,0,1)).
  84.  
  85. empty(#(0,0,0,0)).
  86.  
  87. np_all(#(1,1,1,0)).
  88.  
  89. s_all(#(1,0,1,1)).
  90.  
  91. np_no_chat_trace(#(1,1,0,0)).
  92.  
  93. % mask operations
  94.  
  95. myplus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :-
  96.    or(B1,C1,D1),
  97.    or(B2,C2,D2),
  98.    or(B3,C3,D3),
  99.    or(B4,C4,D4).
  100.  
  101. minus(#(B1,B2,B3,B4),#(C1,C2,C3,C4),#(D1,D2,D3,D4)) :-
  102.    anot(B1,C1,D1),
  103.    anot(B2,C2,D2),
  104.    anot(B3,C3,D3),
  105.    anot(B4,C4,D4).
  106.  
  107. or(1,_,1).
  108. or(0,1,1).
  109. or(0,0,0).
  110.  
  111. anot(X,0,X).
  112. anot(X,1,0).
  113.  
  114. % noun phrase position features
  115.  
  116. role(subj,_,#(1,0,0)).
  117. role(compl,_,#(0,_,_)).
  118. role(undef,main,#(_,0,_)).
  119. role(undef,aux,#(0,_,_)).
  120. role(undef,decl,_).
  121. role(nil,_,_).
  122.  
  123. subj_case(#(1,0,0)).
  124. verb_case(#(0,1,0)).
  125. prep_case(#(0,0,1)).
  126. compl_case(#(0,_,_)).
  127.  
  128.  
  129. %----------------------------------------------------------------------------
  130. %
  131. %  newg
  132. %
  133. %----------------------------------------------------------------------------
  134.  
  135. say(X,Y) :-
  136.    sentence(Y,X,[],[],[]).
  137.  
  138.  
  139. sentence(B,C,D,E,F) :-
  140.    declarative(B,C,G,E,H),
  141.    terminator(.,G,D,H,F).
  142. sentence(B,C,D,E,F) :-
  143.    wh_question(B,C,G,E,H),
  144.    terminator(?,G,D,H,F).
  145. sentence(B,C,D,E,F) :-
  146.    topic(C,G,E,H),
  147.    wh_question(B,G,I,H,J),
  148.    terminator(?,I,D,J,F).
  149. sentence(B,C,D,E,F) :-
  150.    yn_question(B,C,G,E,H),
  151.    terminator(?,G,D,H,F).
  152. sentence(B,C,D,E,F) :-
  153.    imperative(B,C,G,E,H),
  154.    terminator(!,G,D,H,F).
  155.  
  156.  
  157. pp(B,C,D,E,F,F,G,H) :-
  158.    virtual(pp(B,C,D,E),G,H).
  159. pp(pp(B,C),D,E,F,G,H,I,J) :-
  160.    prep(B,G,K,I,L),
  161.    prep_case(M),
  162.    np(C,N,M,O,D,E,F,K,H,L,J).
  163.  
  164.  
  165. topic(B,C,D,x(gap,nonterminal,pp(E,compl,F,G),H)) :-
  166.    pp(E,compl,F,G,B,I,D,J),
  167.    opt_comma(I,C,J,H).
  168.  
  169.  
  170. opt_comma(B,C,D,E) :-
  171.    quote(',',B,C,D,E).
  172. opt_comma(B,B,C,C).
  173.  
  174.  
  175. declarative(decl(B),C,D,E,F) :-
  176.    s(B,G,C,D,E,F).
  177.  
  178.  
  179. wh_question(whq(B,C),D,E,F,G) :-
  180.    variable_q(B,H,I,J,D,K,F,L),
  181.    question(I,J,C,K,E,L,G).
  182.  
  183.  
  184. np(B,C,D,E,F,G,H,I,I,J,K) :-
  185.    virtual(np(B,C,D,E,F,G,H),J,K).
  186. np(np(B,C,[]),B,D,def,E,F,G,H,I,J,K) :-
  187.    is_pp(F),
  188.    pers_pron(C,B,L,H,I,J,K),
  189.    empty(G),
  190.    role(L,decl,D).
  191. np(np(B,C,D),B,E,F,G,H,I,J,K,L,M) :-
  192.    is_pp(H),
  193.    np_head(C,B,F+N,O,D,J,P,L,Q),
  194.    np_all(R),
  195.    np_compls(N,B,G,O,R,I,P,K,Q,M).
  196. np(part(B,C),3+D,E,indef,F,G,H,I,J,K,L) :-
  197.    is_pp(G),
  198.    determiner(B,D,indef,I,M,K,N),
  199.    quote(of,M,O,N,P),
  200.    s_all(Q),
  201.    prep_case(R),
  202.    np(C,3+plu,R,def,F,Q,H,O,J,P,L).
  203.  
  204.  
  205. variable_q(B,C,D,E,F,G,H,x(gap,nonterminal,np(I,C,E,J,K,L,M),N)) :-
  206.    whq(B,C,I,D,F,G,H,N),
  207.    chat_trace(L,M).
  208. variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal,pp(pp(H,I),compl,J,K),L)) :-
  209.    prep(H,E,M,G,N),
  210.    whq(B,C,I,O,M,F,N,L),
  211.    chat_trace(J,K),
  212.    compl_case(D).
  213. variable_q(B,C,compl,D,E,F,G,x(gap,nonterminal,
  214.        adv_phrase(pp(H,np(C,np_head(int_det(B),[],I),[])),J,K),L)) :-
  215.    context_pron(H,I,E,F,G,L),
  216.    chat_trace(J,K),
  217.    verb_case(D).
  218. variable_q(B,C,compl,D,E,F,G,
  219.        x(gap,nonterminal,predicate(adj,value(H,wh(B)),I),J)) :-
  220.    quote(how,E,K,G,L),
  221.    adj(quant,H,K,F,L,J),
  222.    empty(I),
  223.    verb_case(D).
  224.  
  225.  
  226. adv_phrase(B,C,D,E,E,F,G) :-
  227.    virtual(adv_phrase(B,C,D),F,G).
  228. adv_phrase(pp(B,C),D,E,F,G,H,I) :-
  229.    loc_pred(B,F,J,H,K),
  230.    pp(pp(prep(of),C),compl,D,E,J,G,K,I).
  231.  
  232.  
  233. predicate(B,C,D,E,E,F,G) :-
  234.    virtual(predicate(B,C,D),F,G).
  235. predicate(B,C,D,E,F,G,H) :-
  236.    adj_phrase(C,D,E,F,G,H).
  237. predicate(neg,B,C,D,E,F,G) :-
  238.    s_all(H),
  239.    pp(B,compl,H,C,D,E,F,G).
  240. predicate(B,C,D,E,F,G,H) :-
  241.    s_all(I),
  242.    adv_phrase(C,I,D,E,F,G,H).
  243.  
  244.  
  245. whq(B,C,D,undef,E,F,G,H) :-
  246.    int_det(B,C,E,I,G,J),
  247.    s_all(K),
  248.    np(D,C,L,M,subj,K,N,I,F,J,H).
  249. whq(B,3+C,np(3+C,wh(B),[]),D,E,F,G,H) :-
  250.    int_pron(D,E,F,G,H).
  251.  
  252.  
  253. int_det(B,3+C,D,E,F,G) :-
  254.    whose(B,C,D,E,F,G).
  255. int_det(B,3+C,D,E,F,G) :-
  256.    int_art(B,C,D,E,F,G).
  257.  
  258.  
  259. gen_marker(B,B,C,D) :-
  260.    virtual(gen_marker,C,D).
  261. gen_marker(B,C,D,E) :-
  262.    quote('quote',B,F,D,G),
  263.    an_s(F,C,G,E).
  264.  
  265.  
  266. whose(B,C,D,E,F,x(nogap,nonterminal,np_head0(wh(B),C,proper),
  267.       x(nogap,nonterminal,gen_marker,G))) :-
  268.    quote(whose,D,E,F,G).
  269.  
  270.  
  271. question(B,C,D,E,F,G,H) :-
  272.    subj_question(B),
  273.    role(subj,I,C),
  274.    s(D,J,E,F,G,H).
  275. question(B,C,D,E,F,G,H) :-
  276.    fronted_verb(B,C,E,I,G,J),
  277.    s(D,K,I,F,J,H).
  278.  
  279.  
  280. det(B,C,D,E,E,F,G) :-
  281.    virtual(det(B,C,D),F,G).
  282. det(det(B),C,D,E,F,G,H) :-
  283.    terminal(I,E,F,G,H),
  284.    det(I,C,B,D).
  285. det(generic,B,generic,C,C,D,D).
  286.  
  287.  
  288. int_art(B,C,D,E,F,x(nogap,nonterminal,det(G,C,def),H)) :-
  289.    int_art(B,C,G,D,E,F,H).
  290.  
  291.  
  292. subj_question(subj).
  293. subj_question(undef).
  294.  
  295.  
  296. yn_question(q(B),C,D,E,F) :-
  297.    fronted_verb(nil,G,C,H,E,I),
  298.    s(B,J,H,D,I,F).
  299.  
  300.  
  301. verb_form(B,C,D,E,F,F,G,H) :-
  302.    virtual(verb_form(B,C,D,E),G,H).
  303. verb_form(B,C,D,E,F,G,H,I) :-
  304.    terminal(J,F,G,H,I),
  305.    verb_form(J,B,C,D).
  306.  
  307.  
  308. neg(B,C,D,D,E,F) :-
  309.    virtual(neg(B,C),E,F).
  310. neg(aux+B,neg,C,D,E,F) :-
  311.    quote(not,C,D,E,F).
  312. neg(B,pos,C,C,D,D).
  313.  
  314.  
  315. fronted_verb(B,C,D,E,F,x(gap,nonterminal,verb_form(G,H,I,J),
  316.          x(nogap,nonterminal,neg(K,L),M))) :-
  317.    verb_form(G,H,I,N,D,O,F,P),
  318.    verb_type(G,aux+Q),
  319.    role(B,J,C),
  320.    neg(R,L,O,E,P,M).
  321.  
  322.  
  323. imperative(imp(B),C,D,E,F) :-
  324.    imperative_verb(C,G,E,H),
  325.    s(B,I,G,D,H,F).
  326.  
  327.  
  328. imperative_verb(B,C,D,x(nogap,terminal,you,x(nogap,nonterminal,
  329.         verb_form(E,imp+fin,2+sin,main),F))) :-
  330.    verb_form(E,inf,G,H,B,C,D,F).
  331.  
  332.  
  333. s(s(B,C,D,E),F,G,H,I,J) :-
  334.    subj(B,K,L,G,M,I,N),
  335.    verb(C,K,L,O,M,P,N,Q),
  336.    empty(R),
  337.    s_all(S),
  338.    verb_args(L,O,D,R,T,P,U,Q,V),
  339.    minus(S,T,W),
  340.    myplus(S,T,X),
  341.    verb_mods(E,W,X,F,U,H,V,J).
  342.  
  343.  
  344. subj(there,B,C+be,D,E,F,G) :-
  345.    quote(there,D,E,F,G).
  346. subj(B,C,D,E,F,G,H) :-
  347.    s_all(I),
  348.    subj_case(J),
  349.    np(B,C,J,K,subj,I,L,E,F,G,H).
  350.  
  351.  
  352. np_head(B,C,D,E,F,G,H,I,J) :-
  353.    np_head0(K,L,M,G,N,I,O),
  354.    possessive(K,L,M,P,P,B,C,D,E,F,N,H,O,J).
  355.  
  356.  
  357. np_head0(B,C,D,E,E,F,G) :-
  358.    virtual(np_head0(B,C,D),F,G).
  359. np_head0(name(B),3+sin,def+proper,C,D,E,F) :-
  360.    name(B,C,D,E,F).
  361. np_head0(np_head(B,C,D),3+E,F+common,G,H,I,J) :-
  362.    determiner(B,E,F,G,K,I,L),
  363.    adjs(C,K,M,L,N),
  364.    noun(D,E,M,H,N,J).
  365. np_head0(B,C,def+proper,D,E,F,x(nogap,nonterminal,gen_marker,G)) :-
  366.    poss_pron(B,C,D,E,F,G).
  367. np_head0(np_head(B,[],C),3+sin,indef+common,D,E,F,G) :-
  368.    quantifier_pron(B,C,D,E,F,G).
  369.  
  370.  
  371. np_compls(proper,B,C,[],D,E,F,F,G,G) :-
  372.    empty(E).
  373. np_compls(common,B,C,D,E,F,G,H,I,J) :-
  374.    np_all(K),
  375.    np_mods(B,C,L,D,E,M,K,N,G,O,I,P),
  376.    relative(B,L,M,N,F,O,H,P,J).
  377.  
  378.  
  379. possessive(B,C,D,[],E,F,G,H,I,J,K,L,M,N) :-
  380.    gen_case(K,O,M,P),
  381.    np_head0(Q,R,S,O,T,P,U),
  382.    possessive(Q,R,S,V,[pp(poss,np(C,B,E))|V],F,G,H,I,J,T,L,U,N).
  383. possessive(B,C,D,E,F,B,C,D,E,F,G,G,H,H).
  384.  
  385.  
  386. gen_case(B,C,D,x(nogap,terminal,the,E)) :-
  387.    gen_marker(B,C,D,E).
  388.  
  389.  
  390. an_s(B,C,D,E) :-
  391.    quote(s,B,C,D,E).
  392. an_s(B,B,C,C).
  393.  
  394.  
  395. determiner(B,C,D,E,F,G,H) :-
  396.    det(B,C,D,E,F,G,H).
  397. determiner(B,C,D,E,F,G,H) :-
  398.    quant_phrase(B,C,D,E,F,G,H).
  399.  
  400.  
  401. quant_phrase(quant(B,C),D,E,F,G,H,I) :-
  402.    quant(B,E,F,J,H,K),
  403.    number(C,D,J,G,K,I).
  404.  
  405.  
  406. quant(B,indef,C,D,E,F) :-
  407.    neg_adv(G,B,C,H,E,I),
  408.    comp_adv(G,H,J,I,K),
  409.    quote(than,J,D,K,F).
  410. quant(B,indef,C,D,E,F) :-
  411.    quote(at,C,G,E,H),
  412.    sup_adv(I,G,D,H,F),
  413.    sup_op(I,B).
  414. quant(the,def,B,C,D,E) :-
  415.    quote(the,B,C,D,E).
  416. quant(same,indef,B,B,C,C).
  417.  
  418.  
  419. neg_adv(B,not+B,C,D,E,F) :-
  420.    quote(not,C,D,E,F).
  421. neg_adv(B,B,C,C,D,D).
  422.  
  423.  
  424. sup_op(least,not+less).
  425. sup_op(most,not+more).
  426.  
  427.  
  428. np_mods(B,C,D,[E|F],G,H,I,J,K,L,M,N) :-
  429.    np_mod(B,C,E,G,O,K,P,M,Q),
  430.    chat_trace(R),
  431.    myplus(R,O,S),
  432.    minus(G,S,T),
  433.    myplus(O,G,U),
  434.    np_mods(B,C,D,F,T,H,U,J,P,L,Q,N).
  435. np_mods(B,C,D,D,E,E,F,F,G,G,H,H).
  436.  
  437.  
  438. np_mod(B,C,D,E,F,G,H,I,J) :-
  439.    pp(D,C,E,F,G,H,I,J).
  440. np_mod(B,C,D,E,F,G,H,I,J) :-
  441.    reduced_relative(B,D,E,F,G,H,I,J).
  442.  
  443.  
  444. verb_mods([B|C],D,E,F,G,H,I,J) :-
  445.    verb_mod(B,D,K,G,L,I,M),
  446.    chat_trace(N),
  447.    myplus(N,K,O),
  448.    minus(D,O,P),
  449.    myplus(K,D,Q),
  450.    verb_mods(C,P,Q,F,L,H,M,J).
  451. verb_mods([],B,C,C,D,D,E,E).
  452.  
  453.  
  454. verb_mod(B,C,D,E,F,G,H) :-
  455.    adv_phrase(B,C,D,E,F,G,H).
  456. verb_mod(B,C,D,E,F,G,H) :-
  457.    is_adv(C),
  458.    adverb(B,E,F,G,H),
  459.    empty(D).
  460. verb_mod(B,C,D,E,F,G,H) :-
  461.    pp(B,compl,C,D,E,F,G,H).
  462.  
  463.  
  464. adjs([B|C],D,E,F,G) :-
  465.    pre_adj(B,D,H,F,I),
  466.    adjs(C,H,E,I,G).
  467. adjs([],B,B,C,C).
  468.  
  469.  
  470. pre_adj(B,C,D,E,F) :-
  471.    adj(G,B,C,D,E,F).
  472. pre_adj(B,C,D,E,F) :-
  473.    sup_phrase(B,C,D,E,F).
  474.  
  475.  
  476. sup_phrase(sup(most,B),C,D,E,F) :-
  477.    sup_adj(B,C,D,E,F).
  478. sup_phrase(sup(B,C),D,E,F,G) :-
  479.    sup_adv(B,D,I,F,J),
  480.    adj(quant,C,I,E,J,G).
  481.  
  482.  
  483. comp_phrase(comp(B,C,D),E,F,G,H,I) :-
  484.    comp(B,C,F,J,H,K),
  485.    np_no_chat_trace(L),
  486.    prep_case(M),
  487.    np(D,N,M,O,compl,L,E,J,G,K,I).
  488.  
  489.  
  490. comp(B,C,D,E,F,G) :-
  491.    comp_adv(B,D,H,F,I),
  492.    adj(quant,C,H,J,I,K),
  493.    quote(than,J,E,K,G).
  494. comp(more,B,C,D,E,F) :-
  495.    rel_adj(B,C,G,E,H),
  496.    quote(than,G,D,H,F).
  497. comp(same,B,C,D,E,F) :-
  498.    quote(as,C,G,E,H),
  499.    adj(quant,B,G,I,H,J),
  500.    quote(as,I,D,J,F).
  501.  
  502.  
  503. relative(B,[C],D,E,F,G,H,I,J) :-
  504.    is_pred(D),
  505.    rel_conj(B,K,C,F,G,H,I,J).
  506. relative(B,[],C,D,D,E,E,F,F).
  507.  
  508.  
  509. rel_conj(B,C,D,E,F,G,H,I) :-
  510.    rel(B,J,K,F,L,H,M),
  511.    rel_rest(B,C,J,D,K,E,L,G,M,I).
  512.  
  513.  
  514. rel_rest(B,C,D,E,F,G,H,I,J,K) :-
  515.    conj(C,L,D,M,E,H,N,J,O),
  516.    rel_conj(B,L,M,G,N,I,O,K).
  517. rel_rest(B,C,D,D,E,E,F,F,G,G).
  518.  
  519.  
  520. rel(B,rel(C,D),E,F,G,H,I) :-
  521.    o_p_e_n(F,J,H,K),
  522.    variable(B,C,J,L,K,M),
  523.    s(D,N,L,O,M,P),
  524.    chat_trace(Q),
  525.    minus(N,Q,E),
  526.    close(O,G,P,I).
  527.  
  528.  
  529. variable(B,C,D,E,F,x(gap,nonterminal,np(np(B,wh(C),[]),B,G,H,I,J,K),L)) :-
  530.    quote(that,D,E,F,L),
  531.    chat_trace(J,K).
  532. variable(B,C,D,E,F,x(gap,nonterminal,np(G,H,I,J,K,L,M),N)) :-
  533.    wh(C,B,G,H,I,D,E,F,N),
  534.    chat_trace(L,M).
  535. variable(B,C,D,E,F,x(gap,nonterminal,pp(pp(G,H),compl,I,J),K)) :-
  536.    prep(G,D,L,F,M),
  537.    wh(C,B,H,N,O,L,E,M,K),
  538.    chat_trace(I,J),
  539.    compl_case(O).
  540.  
  541.  
  542. wh(B,C,np(C,wh(B),[]),C,D,E,F,G,H) :-
  543.    rel_pron(I,E,F,G,H),
  544.    role(I,decl,D).
  545. wh(B,C,np(D,E,[pp(F,G)]),D,H,I,J,K,L) :-
  546.    np_head0(E,D,M+common,I,N,K,O),
  547.    prep(F,N,P,O,Q),
  548.    wh(B,C,G,R,S,P,J,Q,L).
  549. wh(B,C,D,E,F,G,H,I,J) :-
  550.    whose(B,C,G,K,I,L),
  551.    s_all(M),
  552.    np(D,E,F,def,subj,M,N,K,H,L,J).
  553.  
  554.  
  555. reduced_relative(B,C,D,E,F,G,H,I) :-
  556.    is_pred(D),
  557.    reduced_rel_conj(B,J,C,E,F,G,H,I).
  558.  
  559.  
  560. reduced_rel_conj(B,C,D,E,F,G,H,I) :-
  561.    reduced_rel(B,J,K,F,L,H,M),
  562.    reduced_rel_rest(B,C,J,D,K,E,L,G,M,I).
  563.  
  564.  
  565. reduced_rel_rest(B,C,D,E,F,G,H,I,J,K) :-
  566.    conj(C,L,D,M,E,H,N,J,O),
  567.    reduced_rel_conj(B,L,M,G,N,I,O,K).
  568. reduced_rel_rest(B,C,D,D,E,E,F,F,G,G).
  569.  
  570.  
  571. reduced_rel(B,reduced_rel(C,D),E,F,G,H,I) :-
  572.    o_p_e_n(F,J,H,K),
  573.    reduced_wh(B,C,J,L,K,M),
  574.    s(D,N,L,O,M,P),
  575.    chat_trace(Q),
  576.    minus(N,Q,E),
  577.    close(O,G,P,I).
  578.  
  579.  
  580. reduced_wh(B,C,D,E,F,x(nogap,nonterminal,
  581.        np(np(B,wh(C),[]),B,G,H,I,J,K),x(nogap,nonterminal,
  582.        verb_form(be,pres+fin,B,main),x(nogap,nonterminal,
  583.        neg(L,M),x(nogap,nonterminal,predicate(M,N,O),P))))) :-
  584.    neg(Q,M,D,R,F,S),
  585.    predicate(M,N,O,R,E,S,P),
  586.    chat_trace(J,K),
  587.    subj_case(G).
  588. reduced_wh(B,C,D,E,F,x(nogap,nonterminal,
  589.        np(np(B,wh(C),[]),B,G,H,I,J,K),x(nogap,nonterminal,
  590.        verb(L,M,N,O),P))) :-
  591.    participle(L,N,O,D,E,F,P),
  592.    chat_trace(J,K),
  593.    subj_case(G).
  594. reduced_wh(B,C,D,E,F,x(nogap,nonterminal,
  595.        np(G,H,I,J,K,L,M),x(gap,nonterminal,
  596.        np(np(B,wh(C),[]),B,N,O,P,Q,R),S))) :-
  597.    s_all(T),
  598.    subj_case(I),
  599.    verb_case(N),
  600.    np(G,H,U,J,subj,T,V,D,E,F,S),
  601.    chat_trace(L,M),
  602.    chat_trace(Q,R).
  603.  
  604.  
  605. verb(B,C,D,E,F,F,G,H) :-
  606.    virtual(verb(B,C,D,E),G,H).
  607. verb(verb(B,C,D+fin,E,F),G,H,C,I,J,K,L) :-
  608.    verb_form(M,D+fin,G,N,I,O,K,P),
  609.    verb_type(M,Q),
  610.    neg(Q,F,O,R,P,S),
  611.    rest_verb(N,M,B,C,E,R,J,S,L),
  612.    verb_type(B,H).
  613.  
  614.  
  615. rest_verb(aux,have,B,C,[perf|D],E,F,G,H) :-
  616.    verb_form(I,past+part,J,K,E,L,G,M),
  617.    have(I,B,C,D,L,F,M,H).
  618. rest_verb(aux,be,B,C,D,E,F,G,H) :-
  619.    verb_form(I,J,K,L,E,M,G,N),
  620.    be(J,I,B,C,D,M,F,N,H).
  621. rest_verb(aux,do,B,active,[],C,D,E,F) :-
  622.    verb_form(B,inf,G,H,C,D,E,F).
  623. rest_verb(main,B,B,active,[],C,C,D,D).
  624.  
  625.  
  626. have(be,B,C,D,E,F,G,H) :-
  627.    verb_form(I,J,K,L,E,M,G,N),
  628.    be(J,I,B,C,D,M,F,N,H).
  629. have(B,B,active,[],C,C,D,D).
  630.  
  631.  
  632. be(past+part,B,B,passive,[],C,C,D,D).
  633. be(pres+part,B,C,D,[prog],E,F,G,H) :-
  634.    passive(B,C,D,E,F,G,H).
  635.  
  636.  
  637. passive(be,B,passive,C,D,E,F) :-
  638.    verb_form(B,past+part,G,H,C,D,E,F),
  639.    verb_type(B,I),
  640.    passive(I).
  641. passive(B,B,active,C,C,D,D).
  642.  
  643.  
  644. participle(verb(B,C,inf,D,E),F,C,G,H,I,J) :-
  645.    neg(K,E,G,L,I,M),
  646.    verb_form(B,N,O,P,L,H,M,J),
  647.    participle(N,C,D),
  648.    verb_type(B,F).
  649.  
  650.  
  651. passive(B+trans).
  652. passive(B+ditrans).
  653.  
  654.  
  655. participle(pres+part,active,[prog]).
  656. participle(past+part,passive,[]).
  657.  
  658.  
  659. close(B,B,C,D) :-
  660.    virtual(close,C,D).
  661.  
  662.  
  663. o_p_e_n(B,B,C,x(gap,nonterminal,close,C)).
  664.  
  665.  
  666. verb_args(B+C,D,E,F,G,H,I,J,K) :-
  667.    advs(E,L,M,H,N,J,O),
  668.    verb_args(C,D,L,F,G,N,I,O,K).
  669. verb_args(trans,active,[arg(dir,B)],C,D,E,F,G,H) :-
  670.    verb_arg(np,B,D,E,F,G,H).
  671. verb_args(ditrans,B,[arg(C,D)|E],F,G,H,I,J,K) :-
  672.    verb_arg(np,D,L,H,M,J,N),
  673.    object(C,E,L,G,M,I,N,K).
  674. verb_args(be,B,[void],C,C,D,E,F,G) :-
  675.    terminal(there,D,E,F,G).
  676. verb_args(be,B,[arg(predicate,C)],D,E,F,G,H,I) :-
  677.    pred_conj(J,C,E,F,G,H,I).
  678. verb_args(be,B,[arg(dir,C)],D,E,F,G,H,I) :-
  679.    verb_arg(np,C,E,F,G,H,I).
  680. verb_args(have,active,[arg(dir,B)],C,D,E,F,G,H) :-
  681.    verb_arg(np,B,D,E,F,G,H).
  682. verb_args(B,C,[],D,D,E,E,F,F) :-
  683.    no_args(B).
  684.  
  685.  
  686. object(B,C,D,E,F,G,H,I) :-
  687.    adv(J),
  688.    minus(J,D,K),
  689.    advs(C,L,K,F,M,H,N),
  690.    obj(B,L,D,E,M,G,N,I).
  691.  
  692.  
  693. obj(ind,[arg(dir,B)],C,D,E,F,G,H) :-
  694.    verb_arg(np,B,D,E,F,G,H).
  695. obj(dir,[],B,B,C,C,D,D).
  696.  
  697.  
  698. pred_conj(B,C,D,E,F,G,H) :-
  699.    predicate(I,J,K,E,L,G,M),
  700.    pred_rest(B,J,C,K,D,L,F,M,H).
  701.  
  702.  
  703. pred_rest(B,C,D,E,F,G,H,I,J) :-
  704.    conj(B,K,C,L,D,G,M,I,N),
  705.    pred_conj(K,L,F,M,H,N,J).
  706. pred_rest(B,C,C,D,D,E,E,F,F).
  707.  
  708.  
  709. verb_arg(np,B,C,D,E,F,G) :-
  710.    s_all(H),
  711.    verb_case(I),
  712.    np(B,J,I,K,compl,H,C,D,E,F,G).
  713.  
  714.  
  715. advs([B|C],D,E,F,G,H,I) :-
  716.    is_adv(E),
  717.    adverb(B,F,J,H,K),
  718.    advs(C,D,E,J,G,K,I).
  719. advs(B,B,C,D,D,E,E).
  720.  
  721.  
  722. adj_phrase(B,C,D,E,F,G) :-
  723.    adj(H,B,D,E,F,G),
  724.    empty(C).
  725. adj_phrase(B,C,D,E,F,G) :-
  726.    comp_phrase(B,C,D,E,F,G).
  727.  
  728.  
  729. no_args(trans).
  730. no_args(ditrans).
  731. no_args(intrans).
  732.  
  733.  
  734. conj(conj(B,C),conj(B,D),E,F,conj(B,E,F),G,H,I,J) :-
  735.    conj(B,C,D,G,H,I,J).
  736.  
  737.  
  738. noun(B,C,D,E,F,G) :-
  739.    terminal(H,D,E,F,G),
  740.    noun_form(H,B,C).
  741.  
  742.  
  743. adj(B,adj(C),D,E,F,G) :-
  744.    terminal(C,D,E,F,G),
  745.    adj(C,B).
  746.  
  747.  
  748. prep(prep(B),C,D,E,F) :-
  749.    terminal(B,C,D,E,F),
  750.    prep(B).
  751.  
  752.  
  753. rel_adj(adj(B),C,D,E,F) :-
  754.    terminal(G,C,D,E,F),
  755.    rel_adj(G,B).
  756.  
  757.  
  758. sup_adj(adj(B),C,D,E,F) :-
  759.    terminal(G,C,D,E,F),
  760.    sup_adj(G,B).
  761.  
  762.  
  763. comp_adv(less,B,C,D,E) :-
  764.    quote(less,B,C,D,E).
  765. comp_adv(more,B,C,D,E) :-
  766.    quote(more,B,C,D,E).
  767.  
  768.  
  769. sup_adv(least,B,C,D,E) :-
  770.    quote(least,B,C,D,E).
  771. sup_adv(most,B,C,D,E) :-
  772.    quote(most,B,C,D,E).
  773.  
  774.  
  775. rel_pron(B,C,D,E,F) :-
  776.    terminal(G,C,D,E,F),
  777.    rel_pron(G,B).
  778.  
  779.  
  780. name(B,C,D,E,F) :-
  781.    opt_the(C,G,E,H),
  782.    terminal(B,G,D,H,F),
  783.    name(B).
  784.  
  785.  
  786. int_art(B,plu,quant(same,wh(B)),C,D,E,F) :-
  787.    quote(how,C,G,E,H),
  788.    quote(many,G,D,H,F).
  789. int_art(B,C,D,E,F,G,H) :-
  790.    terminal(I,E,F,G,H),
  791.    int_art(I,B,C,D).
  792.  
  793.  
  794. int_pron(B,C,D,E,F) :-
  795.    terminal(G,C,D,E,F),
  796.    int_pron(G,B).
  797.  
  798.  
  799. adverb(adv(B),C,D,E,F) :-
  800.    terminal(B,C,D,E,F),
  801.    adverb(B).
  802.  
  803.  
  804. poss_pron(pronoun(B),C+D,E,F,G,H) :-
  805.    terminal(I,E,F,G,H),
  806.    poss_pron(I,B,C,D).
  807.  
  808.  
  809. pers_pron(pronoun(B),C+D,E,F,G,H,I) :-
  810.    terminal(J,F,G,H,I),
  811.    pers_pron(J,B,C,D,E).
  812.  
  813.  
  814. quantifier_pron(B,C,D,E,F,G) :-
  815.    terminal(H,D,E,F,G),
  816.    quantifier_pron(H,B,C).
  817.  
  818.  
  819. context_pron(prep(in),place,B,C,D,E) :-
  820.    quote(where,B,C,D,E).
  821. context_pron(prep(at),time,B,C,D,E) :-
  822.    quote(when,B,C,D,E).
  823.  
  824.  
  825. number(nb(B),C,D,E,F,G) :-
  826.    terminal(H,D,E,F,G),
  827.    number(H,B,C).
  828.  
  829.  
  830. terminator(B,C,D,E,F) :-
  831.    terminal(G,C,D,E,F),
  832.    terminator(G,B).
  833.  
  834.  
  835. opt_the(B,B,C,C).
  836. opt_the(B,C,D,E) :-
  837.    quote(the,B,C,D,E).
  838.  
  839.  
  840. conj(B,list,list,C,D,E,F) :-
  841.    terminal(',',C,D,E,F).
  842. conj(B,list,'end',C,D,E,F) :-
  843.    terminal(B,C,D,E,F),
  844.    conj(B).
  845.  
  846.  
  847. loc_pred(B,C,D,E,F) :-
  848.    terminal(G,C,D,E,F),
  849.    loc_pred(G,B).
  850.  
  851.  
  852. quote(B,C,D,E,F) :-
  853.    terminal(B,C,D,E,F),
  854.    quote(B).
  855.  
  856.  
  857. %----------------------------------------------------------------------------
  858. %
  859. %  newdic
  860. %
  861. %----------------------------------------------------------------------------
  862.  
  863. word(Word) :- quote(Word).
  864. word(Word) :- conj(Word).
  865. word(Word) :- adverb(Word).
  866. word(Word) :- sup_adj(Word,_).
  867. word(Word) :- rel_adj(Word,_).
  868. word(Word) :- adj(Word,_).
  869. word(Word) :- name(Word).
  870. word(Word) :- terminator(Word,_).
  871. word(Word) :- pers_pron(Word,_,_,_,_).
  872. word(Word) :- poss_pron(Word,_,_,_).
  873. word(Word) :- rel_pron(Word,_).
  874. word(Word) :- verb_form(Word,_,_,_).
  875. word(Word) :- noun_form(Word,_,_).
  876. word(Word) :- prep(Word).
  877. word(Word) :- quantifier_pron(Word,_,_).
  878. word(Word) :- number(Word,_,_).
  879. word(Word) :- det(Word,_,_,_).
  880. word(Word) :- int_art(Word,_,_,_).
  881. word(Word) :- int_pron(Word,_).
  882. word(Word) :- loc_pred(Word,_).
  883.  
  884. quote(how).
  885. quote(whose).
  886. quote(there).
  887. quote(of).
  888. quote('quote').        % use ` instead of ' to help assembler
  889. quote(',').    
  890. quote(s).
  891. quote(than).
  892. quote(at).
  893. quote(the).
  894. quote(not).
  895. quote(as).
  896. quote(that).
  897. quote(less).
  898. quote(more).
  899. quote(least).
  900. quote(most).
  901. quote(many).
  902. quote(where).
  903. quote(when).
  904.  
  905. conj(and).
  906. conj(or).
  907.  
  908. int_pron(what,undef).
  909. int_pron(which,undef).
  910. int_pron(who,subj).
  911. int_pron(whom,compl).
  912.  
  913. int_art(what,X,_,int_det(X)).
  914. int_art(which,X,_,int_det(X)).
  915.  
  916. det(the,No,the(No),def).
  917. det(a,sin,a,indef).
  918. det(an,sin,a,indef).
  919. det(every,sin,every,indef).
  920. det(some,_,some,indef).
  921. det(any,_,any,indef).
  922. det(all,plu,all,indef).
  923. det(each,sin,each,indef).
  924. det(no,_,no,indef).
  925.  
  926. number(W,I,Nb) :-
  927.    tr_number(W,I),
  928.    ag_number(I,Nb).
  929.  
  930. tr_number(nb(I),I).
  931. tr_number(one,1).
  932. tr_number(two,2).
  933. tr_number(three,3).
  934. tr_number(four,4).
  935. tr_number(five,5).
  936. tr_number(six,6).
  937. tr_number(seven,7).
  938. tr_number(eight,8).
  939. tr_number(nine,9).
  940. tr_number(ten,10).
  941.  
  942. ag_number(1,sin).
  943. ag_number(N,plu) :- N>1.
  944.  
  945. quantifier_pron(everybody,every,person).
  946. quantifier_pron(everyone,every,person).
  947. quantifier_pron(everything,every,thing).
  948. quantifier_pron(somebody,some,person).
  949. quantifier_pron(someone,some,person).
  950. quantifier_pron(something,some,thing).
  951. quantifier_pron(anybody,any,person).
  952. quantifier_pron(anyone,any,person).
  953. quantifier_pron(anything,any,thing).
  954. quantifier_pron(nobody,no,person).
  955. quantifier_pron(nothing,no,thing).
  956.  
  957. prep(as).
  958. prep(at).
  959. prep(of).
  960. prep(to).
  961. prep(by).
  962. prep(with).
  963. prep(in).
  964. prep(on).
  965. prep(from).
  966. prep(into).
  967. prep(through).
  968.  
  969. noun_form(Plu,Sin,plu) :- noun_plu(Plu,Sin).
  970. noun_form(Sin,Sin,sin) :- noun_sin(Sin).
  971. noun_form(proportion,proportion,_).
  972. noun_form(percentage,percentage,_).
  973.  
  974. root_form(1+sin).
  975. root_form(2+_).
  976. root_form(1+plu).
  977. root_form(3+plu).
  978.  
  979. verb_root(be).
  980. verb_root(have).
  981. verb_root(do).
  982. verb_root(border).
  983. verb_root(contain).
  984. verb_root(drain).
  985. verb_root(exceed).
  986. verb_root(flow).
  987. verb_root(rise).
  988.  
  989. regular_pres(have).
  990. regular_pres(do).
  991. regular_pres(rise).
  992. regular_pres(border).
  993. regular_pres(contain).
  994. regular_pres(drain).
  995. regular_pres(exceed).
  996. regular_pres(flow).
  997.  
  998. regular_past(had,have).
  999. regular_past(bordered,border).
  1000. regular_past(contained,contain).
  1001. regular_past(drained,drain).
  1002. regular_past(exceeded,exceed).
  1003. regular_past(flowed,flow).
  1004.  
  1005. rel_pron(who,subj).
  1006. rel_pron(whom,compl).
  1007. rel_pron(which,undef).
  1008.  
  1009. poss_pron(my,_,1,sin).
  1010. poss_pron(your,_,2,_).
  1011. poss_pron(his,masc,3,sin).
  1012. poss_pron(her,fem,3,sin).
  1013. poss_pron(its,neut,3,sin).
  1014. poss_pron(our,_,1,plu).
  1015. poss_pron(their,_,3,plu).
  1016.  
  1017. pers_pron(i,_,1,sin,subj).
  1018. pers_pron(you,_,2,_,_).
  1019. pers_pron(he,masc,3,sin,subj).
  1020. pers_pron(she,fem,3,sin,subj).
  1021. pers_pron(it,neut,3,sin,_).
  1022. pers_pron(we,_,1,plu,subj).
  1023. pers_pron(them,_,3,plu,subj).
  1024. pers_pron(me,_,1,sin,compl(_)).
  1025. pers_pron(him,masc,3,sin,compl(_)).
  1026. pers_pron(her,fem,3,sin,compl(_)).
  1027. pers_pron(us,_,1,plu,compl(_)).
  1028. pers_pron(them,_,3,plu,compl(_)).
  1029.  
  1030. terminator(.,_).
  1031. terminator(?,?).
  1032. terminator(!,!).
  1033.  
  1034. name(_).
  1035.  
  1036. % ===========================================================================
  1037.  
  1038. % specialised dictionary
  1039.  
  1040. loc_pred(east,prep(eastof)).
  1041. loc_pred(west,prep(westof)).
  1042. loc_pred(north,prep(northof)).
  1043. loc_pred(south,prep(southof)).
  1044.  
  1045. adj(minimum,restr).
  1046. adj(maximum,restr).
  1047. adj(average,restr).
  1048. adj(total,restr).
  1049. adj(african,restr).
  1050. adj(american,restr).
  1051. adj(asian,restr).
  1052. adj(european,restr).
  1053. adj(great,quant).
  1054. adj(big,quant).
  1055. adj(small,quant).
  1056. adj(large,quant).
  1057. adj(old,quant).
  1058. adj(new,quant).
  1059. adj(populous,quant).
  1060.  
  1061. rel_adj(greater,great).
  1062. rel_adj(less,small).
  1063. rel_adj(bigger,big).
  1064. rel_adj(smaller,small).
  1065. rel_adj(larger,large).
  1066. rel_adj(older,old).
  1067. rel_adj(newer,new).
  1068.  
  1069. sup_adj(biggest,big).
  1070. sup_adj(smallest,small).
  1071. sup_adj(largest,large).
  1072. sup_adj(oldest,old).
  1073. sup_adj(newest,new).
  1074.  
  1075. noun_sin(average).
  1076. noun_sin(total).
  1077. noun_sin(sum).
  1078. noun_sin(degree).
  1079. noun_sin(sqmile).
  1080. noun_sin(ksqmile).
  1081. noun_sin(thousand).
  1082. noun_sin(million).
  1083. noun_sin(time).
  1084. noun_sin(place).
  1085. noun_sin(area).
  1086. noun_sin(capital).
  1087. noun_sin(city).
  1088. noun_sin(continent).
  1089. noun_sin(country).
  1090. noun_sin(latitude).
  1091. noun_sin(longitude).
  1092. noun_sin(ocean).
  1093. noun_sin(person).
  1094. noun_sin(population).
  1095. noun_sin(region).
  1096. noun_sin(river).
  1097. noun_sin(sea).
  1098. noun_sin(seamass).
  1099. noun_sin(number).
  1100.  
  1101. noun_plu(averages,average).
  1102. noun_plu(totals,total).
  1103. noun_plu(sums,sum).
  1104. noun_plu(degrees,degree).
  1105. noun_plu(sqmiles,sqmile).
  1106. noun_plu(ksqmiles,ksqmile).
  1107. noun_plu(million,million).
  1108. noun_plu(thousand,thousand).
  1109. noun_plu(times,time).
  1110. noun_plu(places,place).
  1111. noun_plu(areas,area).
  1112. noun_plu(capitals,capital).
  1113. noun_plu(cities,city).
  1114. noun_plu(continents,continent).
  1115. noun_plu(countries,country).
  1116. noun_plu(latitudes,latitude).
  1117. noun_plu(longitudes,longitude).
  1118. noun_plu(oceans,ocean).
  1119. noun_plu(persons,person).  noun_plu(people,person).
  1120. noun_plu(populations,population).
  1121. noun_plu(regions,region).
  1122. noun_plu(rivers,river).
  1123. noun_plu(seas,sea).
  1124. noun_plu(seamasses,seamass).
  1125. noun_plu(numbers,number).
  1126.  
  1127. verb_form(V,V,inf,_) :- verb_root(V).
  1128. verb_form(V,V,pres+fin,Agmt) :-
  1129.    regular_pres(V),
  1130.    root_form(Agmt),
  1131.    verb_root(V).
  1132. verb_form(Past,Root,past+_,_) :-
  1133.    regular_past(Past,Root).
  1134.  
  1135. verb_form(am,be,pres+fin,1+sin).
  1136. verb_form(are,be,pres+fin,2+sin).
  1137. verb_form(is,be,pres+fin,3+sin).
  1138. verb_form(are,be,pres+fin,_+plu).
  1139. verb_form(was,be,past+fin,1+sin).
  1140. verb_form(were,be,past+fin,2+sin).
  1141. verb_form(was,be,past+fin,3+sin).
  1142. verb_form(were,be,past+fin,_+plu).
  1143. verb_form(been,be,past+part,_).
  1144. verb_form(being,be,pres+part,_).
  1145. verb_form(has,have,pres+fin,3+sin).
  1146. verb_form(having,have,pres+part,_).
  1147. verb_form(does,do,pres+fin,3+sin).
  1148. verb_form(did,do,past+fin,_).
  1149. verb_form(doing,do,pres+part,_).
  1150. verb_form(done,do,past+part,_).
  1151. verb_form(flows,flow,pres+fin,3+sin).
  1152. verb_form(flowing,flow,pres+part,_).
  1153. verb_form(rises,rise,pres+fin,3+sin).
  1154. verb_form(rose,rise,past+fin,_).
  1155. verb_form(risen,rise,past+part,_).
  1156. verb_form(borders,border,pres+fin,3+sin).
  1157. verb_form(bordering,border,pres+part,_).
  1158. verb_form(contains,contain,pres+fin,3+sin).
  1159. verb_form(containing,contain,pres+part,_).
  1160. verb_form(drains,drain,pres+fin,3+sin).
  1161. verb_form(draining,drain,pres+part,_).
  1162. verb_form(exceeds,exceed,pres+fin,3+sin).
  1163. verb_form(exceeding,exceed,pres+part,_).
  1164.  
  1165. verb_type(have,aux+have).
  1166. verb_type(be,aux+be).
  1167. verb_type(do,aux+ditrans).
  1168. verb_type(rise,main+intrans).
  1169. verb_type(border,main+trans).
  1170. verb_type(contain,main+trans).
  1171. verb_type(drain,main+intrans).
  1172. verb_type(exceed,main+trans).
  1173. verb_type(flow,main+intrans).
  1174.  
  1175. adverb(yesterday).
  1176. adverb(tomorrow).
  1177.  
  1178. go(Mes):-test(T),nl,write(Mes=[T]),nl.
  1179.  
  1180. go:-go('BMARK_chat:').
  1181. p:-[chat].
  1182.