1/*  Copyright 1986-2020 David H. D. Warren and Fernando C. N. Pereira
    2
    3    Permission is hereby granted, free of charge, to any person obtaining a
    4    copy of this software and associated documentation files (the
    5    "Software"), to deal in the Software without restriction, including
    6    without limitation the rights to use, copy, modify, merge, publish,
    7    distribute, sublicense, and/or sell copies of the Software, and to
    8    permit persons to whom the Software is furnished to do so, subject to
    9    the following conditions:
   10
   11    The above copyright notice and this permission notice shall be included
   12    in all copies or substantial portions of the Software.
   13
   14    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   15    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   16    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   17    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
   18    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
   19    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   20    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   21*/
   22
   23i_sentence(q(S),question([],P)) :-
   24   i_s(S,P,[],0).
   25i_sentence(whq(X,S),question([X],P)) :-
   26   i_s(S,P,[],0).
   27i_sentence(imp(s(_,Verb,VArgs,VMods)),imp(V,Args)) :-
   28   i_verb(Verb,V,_,active,pos,Slots0,[],transparent),
   29   i_verb_args(VArgs,[],[],Slots0,Slots,Args,Args0,Up,-0),
   30   conc(Up,VMods,Mods),
   31   i_verb_mods(Mods,_,[],Slots,Args0,Up,+0).
   32
   33i_np(there,Y,quant(void,_X,~true,~true,[],Y),[],_,_,XA,XA).
   34i_np(NP,Y,Q,Up,Id0,Index,XA0,XA) :-
   35   i_np_head(NP,Y,Q,Det,Det0,X,Pred,QMods,Slots0,Id0),
   36   held_arg(XA0,XA,Slots0,Slots,Id0,Id),
   37   i_np_rest(NP,Det,Det0,X,Pred,QMods,Slots,Up,Id,Index).
   38
   39i_np_head(np(_,Kernel,_),Y,
   40      quant(Det,T,Head,Pred0,QMods,Y),
   41      Det,Det0,X,Pred,QMods,Slots,_Id) :-
   42   i_np_head0(Kernel,X,T,Det0,Head,Pred0,Pred,Slots),
   43   Type-_=Y, Type-_=T.
   44
   45i_np_rest(np(_,_,Mods),Det,Det0,X,Pred,QMods,Slots,Up,Id,Index) :-
   46   index_args(Det0,Index,Id,Det,IndexA),
   47   i_np_mods(Mods,X,Slots,Pred,QMods,Up,Id,IndexA).
   48
   49held_arg(held_arg(Case,-Id,X),[],S0,S,Id,+Id) :-
   50   in_slot(S0,Case,X,Id,S,_).
   51held_arg(XA,XA,S,S,Id,Id).
   52
   53i_np_head0(np_head(Det,Adjs,Noun),X,T,Det,Head0,Pred0,Pred,Slots) :-
   54   i_adjs(Adjs,X,T,X,Head0,Head,Pred0,Pred),
   55   i_noun(Noun,X,Head,Slots).
   56i_np_head0(np_head(int_det(V),Adjs,Noun),
   57      Type-X,Type-X,Det,~true,Pred,Pred,
   58      [slot(prep(of),Type,X,_,comparator)]) :-
   59   comparator(Noun,Type,V,Adjs,Det).
   60i_np_head0(np_head(quant(Op0,N),Adjs,Noun),
   61      Type-X,Type-X,void,~P,Pred,Pred,[]) :-
   62   measure(Noun,Type,Adjs,Units),
   63   conversion(N,Op0,Type,V,Op),
   64   measure_op(Op,X,V--Units,P).
   65i_np_head0(name(Name),
   66      Type-Name,Type-Name,id,~true,Pred,Pred,[]) :-
   67   name_template(Name,Type).
   68i_np_head0(wh(X),X,X,id,~true,Pred,Pred,[]).
   69
   70i_np_mods(Mods,_,[],~true,[],Mods,_,_).
   71i_np_mods([Mod|Mods],X,Slots0,Pred0,QMods0,Up,Id,Index) :-
   72   i_np_mod(Mod,X,Slots0,Slots,
   73            Pred0,Pred,QMods0,QMods,Up0,-Id,Index),
   74   conc(Up0,Mods,Mods0),
   75   i_np_mods(Mods0,X,Slots,Pred,QMods,Up,+Id,Index).
   76i_np_mods(Mods,_,[Slot|Slots],~true,QMods,Mods,Id,_) :-
   77   i_voids([Slot|Slots],QMods,Id).
   78
   79i_voids([],[],_).
   80i_voids([Slot|Slots],[quant(void,X,~true,~true,[],_)|QMods],Id) :-
   81   nominal_slot(Slot,X,-Id), !,
   82   i_voids(Slots,QMods,+Id).
   83i_voids([_|Slots],QMods,Id) :-
   84   i_voids(Slots,QMods,Id).
   85
   86i_rel(rel(X,S),X,P&Pred,Pred,QMods,QMods,Up,Id) :-
   87   i_s(S,P,Up,Id).
   88i_rel(reduced_rel(X,S),X,Pred,Pred,[A|QMods],QMods,Up,Id) :-
   89   i_s(S,A,Up,Id).
   90i_rel(conj(Conj,Left,Right),X,
   91      conj(Conj,LPred,LQMods,RPred,RQMods)&Pred,Pred,
   92      QMods,QMods,Up,Id) :-
   93   i_rel(Left,X,LPred,~true,LQMods,[],[],-Id),
   94   i_rel(Right,X,RPred,~true,RQMods,[],Up,+Id).
   95
   96i_np_mod(pp(Prep,NP),
   97      X,Slots0,Slots,Pred,Pred,[QMod|QMods],QMods,Up,Id0,Index0) :-
   98   i_np_head(NP,Y,Q,LDet,LDet0,LX,LPred,LQMods,LSlots0,Id0),
   99   i_bind(Prep,Slots0,Slots1,X,Y,Id0,Function,P,PSlots,XArg),
  100   conc(PSlots,Slots1,Slots),
  101   i_np_modify(Function,P,Q,QMod,Index0,Index),
  102   held_arg(XArg,[],LSlots0,LSlots,Id0,Id),
  103   i_np_rest(NP,LDet,LDet0,LX,LPred,LQMods,LSlots,Up,Id,Index).
  104i_np_mod(Mod,X,Slots,Slots,Pred0,Pred,QMods0,QMods,Up,Id,_) :-
  105   i_rel(Mod,X,Pred0,Pred,QMods0,QMods,Up,Id).
  106
  107i_noun(Noun,Type-X,P,Slots) :-
  108   noun_template(Noun,Type,X,P,Slots).
  109
  110i_bind(Prep,Slots0,Slots,_,X,Id,arg,P,[],[]) :-
  111   in_slot(Slots0,Case,X,Id,Slots,P),
  112   deepen_case(Prep,Case).
  113i_bind(prep(Prep),Slots,Slots,X,Y,_,adjoin,~P,PSlots,XArg) :-
  114   i_adjoin(Prep,X,Y,PSlots,XArg,P).
  115
  116i_np_modify(adjoin,P,N,N&P,_,unit).
  117i_np_modify(arg,F,N,N,Index0,Index) :-
  118   index_slot(F,Index0,Index).
  119
  120in_slot([Slot|Slots],Case,X,Id,Slots,F) :-
  121   slot_match(Slot,Case,X,Id,F).
  122in_slot([Slot|Slots0],Case,X,Id,[Slot|Slots],F) :-
  123   in_slot(Slots0,Case,X,Id,Slots,F).
  124
  125slot_match(slot(Case,Type,X,Id,F),Case,Type-X,Id,F).
  126
  127i_adjs([],_X,T,T,Head,Head,Pred,Pred).
  128i_adjs([Adj|Adjs],X,T,T0,Head0,Head,Pred0,Pred) :-
  129   i_adj(Adj,X,T,T1,Head0,Head1,Pred0,Pred1),
  130   i_adjs(Adjs,X,T1,T0,Head1,Head,Pred1,Pred).
  131
  132i_adj(adj(Adj),Type-X,T,T,Head,Head,~P&Pred,Pred) :-
  133   restriction(Adj,Type,X,P).
  134i_adj(adj(Adj),TypeX-X,TypeV-V,_,
  135   aggr(F,V,[X],Head,Pred),Head,~true,Pred) :-
  136   aggr_adj(Adj,TypeV,TypeX,F).
  137i_adj(sup(Op0,adj(Adj)),Type-X,Type-V,_,
  138      aggr(F,V,[Y,X],Head,~P&Pred),Head,~true,Pred) :-
  139   chat_sign(Adj,Sign),
  140   inverse(Op0,Sign,Op),
  141   i_sup_op(Op,F),
  142   attribute(Adj,Type,X,_,Y,P).
  143%JW: Not called and standard/4 is undefined
  144%i_adj(adj(Adj),TypeX-X,T,T,_,
  145%      Head,Head,quant(void,TypeX-Y,~P,~Q&Pred,[],_),Pred) :-
  146%   attribute(Adj,TypeX,X,_,Y,P),
  147%   standard(Adj,TypeX,Y,Q).
  148
  149i_s(s(Subj,Verb,VArgs,VMods),Pred,Up,Id) :-
  150   i_verb(Verb,P,Tense,Voice,Neg,Slots0,XA0,Meta),
  151   i_subj(Voice,Subj,Slots0,Slots1,QSubj,SUp,-(-Id)),
  152   conc(SUp,VArgs,TArgs),
  153   i_verb_args(TArgs,XA0,XA,Slots1,Slots,Args0,Args,Up0,+(-Id)),
  154   conc(Up0,VMods,Mods),
  155   i_verb_mods(Mods,Tense,XA,Slots,Args,Up,+Id),
  156   reshape_pred(Meta,QSubj,Neg,P,Args0,Pred).
  157
  158i_verb(verb(Root,Voice,Tense,_Aspect,Neg),
  159      P,Tense,Voice,Det,Slots,XArg,Meta) :-
  160   verb_template(Root,P,Slots,XArg,Meta),
  161   i_neg(Neg,Det).
  162
  163reshape_pred(transparent,S,N,P,A,pred(S,N,P,A)).
  164reshape_pred(have,Subj,Neg,Verb0,
  165      [quant(Det,X,Head0,Pred,QArgs,Y)|MRest],
  166      pred(Subj,Neg,Verb,[quant(Det,X,Head,Pred,QArgs,Y)|MRest])) :-
  167   have_pred(Head0,Verb0,Head,Verb).
  168
  169have_pred(~Head,Verb,~true,(Head,Verb)).
  170have_pred(Head,Verb,Head,Verb) :-
  171   meta_head(Head).
  172
  173meta_head(apply(_,_)).
  174meta_head(aggr(_,_,_,_,_)).
  175
  176i_neg(pos,id).
  177i_neg(neg,not).
  178
  179i_subj(Voice,Subj,Slots0,Slots,Quant,Up,Id) :-
  180   subj_case(Voice,Case),
  181   verb_slot(arg(Case,Subj),[],[],Slots0,Slots,[Quant],[],Up,Id).
  182
  183i_verb_args(VArgs,XA0,XA,Slots0,Slots,Args0,Args,Up,Id) :-
  184   fill_verb(VArgs,XA0,XA,Slots0,Slots,Args0,Args,Up,Id).
  185
  186subj_case(active,subj).
  187subj_case(passive,s_subj).
  188
  189fill_verb([],XA,XA,Slots,Slots,Args,Args,[],_).
  190fill_verb([Node|Nodes0],XA0,XA,Slots0,Slots,Args0,Args,Up,Id) :-
  191   verb_slot(Node,XA0,XA1,Slots0,Slots1,Args0,Args1,Up0,-Id),
  192   conc(Up0,Nodes0,Nodes),
  193   fill_verb(Nodes,XA1,XA,Slots1,Slots,Args1,Args,Up,+Id).
  194
  195verb_slot(pp(Prep,NP),
  196      XArg0,XArg,Slots0,Slots,[Q|Args],Args,Up,Id) :-
  197   i_np(NP,X,Q,Up,Id,unit,XArg0,XArg),
  198   in_slot(Slots0,Case,X,Id,Slots,_),
  199   deepen_case(Prep,Case).
  200verb_slot(void,XA,XA,Slots,Slots,Args,Args,[],_) :-
  201   in_slot(Slots,pred,_,_,_,_).
  202verb_slot(pp(prep(Prep),NP),
  203      TXArg,TXArg,Slots0,Slots,[Q& ~P|Args],Args,Up,Id0) :-
  204   in_slot(Slots0,pred,X,Id0,Slots1,_),
  205   i_adjoin(Prep,X,Y,PSlots,XArg,P),
  206   i_np_head(NP,Y,Q,LDet,LDet0,LX,LPred,LQMods,LSlots0,Id0),
  207   held_arg(XArg,[],LSlots0,LSlots,Id0,Id),
  208   i_np_rest(NP,LDet,LDet0,LX,LPred,LQMods,LSlots,Up,Id,free),
  209   conc(PSlots,Slots1,Slots).
  210verb_slot(arg(SCase,NP),
  211      XArg0,XArg,Slots0,Slots,[Q|Args],Args,Up,Id) :-
  212   i_np(NP,X,Q,Up,Id,unit,XArg0,XArg),
  213   in_slot(Slots0,Case,X,Id,Slots,_),
  214   deepen_case(SCase,Case).
  215%JW: Commented out as adv_template/4 is not defined
  216%verb_slot(adverb(Adv),XA,XA,Slots0,Slots,[~P|Args],Args,[],Id) :-
  217%   adv_template(Adv,Case,X,P),
  218%   in_slot(Slots0,Case,X,Id,Slots,_).
  219verb_slot(arg(pred,AP),XA,XA,Slots0,Slots,Args0,Args,Up,Id) :-
  220   in_slot(Slots0,pred,X,Id,Slots,_),
  221   i_pred(AP,X,Args0,Args,Up,Id).
  222
  223i_pred(conj(Conj,Left,Right),X,
  224      [conj(Conj,~true,LQMods,~true,RQMods)|QMods],
  225      QMods,Up,Id) :-
  226   i_pred(Left,X,LQMods,[],[],-Id),
  227   i_pred(Right,X,RQMods,[],Up,+Id).
  228i_pred(AP,T,[~Head&Pred|As],As,[],_) :-
  229   i_adj(AP,T,_,_,Head,true,Pred,~true).
  230i_pred(value(adj(Adj),wh(TypeY-Y)),Type-X,[~H|As],As,[],_) :-
  231   attribute(Adj,Type,X,TypeY,Y,H).
  232i_pred(comp(Op0,adj(Adj),NP),X,[P1 & P2 & ~P3,Q|As],As,Up,Id) :-
  233   i_np(NP,Y,Q,Up,Id,unit,[],[]),
  234   chat_sign(Adj,Sign),
  235   i_measure(X,Adj,Type,U,P1),
  236   i_measure(Y,Adj,Type,V,P2),
  237   inverse(Op0,Sign,Op),
  238   measure_op(Op,U,V,P3).
  239i_pred(pp(prep(Prep),NP),X,[~H,Q|As],As,Up,Id) :-
  240   i_np(NP,Y,Q,Up,Id,unit,[],[]),
  241   adjunction(Prep,X,Y,H).
  242
  243i_adjoin(with,TS-S,TV-Y,[slot(prep(of),TV,Z,_,free)],
  244	held_arg(poss,-_Id,TS-S),
  245	Y=Z).
  246i_adjoin(Prep,X,Y,[],[],P) :-
  247   adjunction(Prep,X,Y,P).
  248
  249i_measure(Type-X,Adj,Type,X,~true) :-
  250   units(Adj,Type).
  251i_measure(TypeX-X,Adj,TypeY,Y,quant(void,TypeY-Y,~P,~true,[],_)) :-
  252   attribute(Adj,TypeX,X,TypeY,Y,P).
  253
  254i_verb_mods(Mods,_,XA,Slots0,Args0,Up,Id) :-
  255   fill_verb(Mods,XA,[],Slots0,Slots,Args0,Args,Up,-Id),
  256   i_voids(Slots,Args,+Id).
  257
  258nominal_slot(slot(Kind,Type,X,Id,_),Type-X,Id) :-
  259   nominal_kind(Kind).
  260
  261nominal_kind(prep(_)).
  262nominal_kind(poss).
  263nominal_kind(subj).
  264nominal_kind(dir).
  265nominal_kind(ind).
  266
  267i_sup_op(least,min).
  268i_sup_op(most,max).
  269
  270conversion(wh(Type-X),same,Type,X,id).
  271conversion(nb(N),Op,_,N,Op).
  272
  273measure_op(id,X,X,true).
  274measure_op(same,X,Y,X=Y).
  275measure_op(less,X,Y,exceeds(Y,X)).
  276measure_op(not+less,X,Y,\+exceeds(Y,X)).
  277measure_op(more,X,Y,exceeds(X,Y)).
  278measure_op(not+more,X,Y,\+exceeds(X,Y)).
  279
  280inverse(most,-,least).
  281inverse(least,-,most).
  282inverse(same,-,same).
  283inverse(less,-,more).
  284inverse(more,-,less).
  285inverse(X,+,X).
  286
  287noun_template(Noun,TypeV,V,~P,
  288      [slot(poss,TypeO,O,Os,index)|Slots]) :-
  289   property(Noun,TypeV,V,TypeO,O,P,Slots,Os,_).
  290noun_template(Noun,TypeV,V,aggr(F,V,[],~true,~true),
  291   [slot(prep(of),TypeS,_,_,free)]) :-
  292   aggr_noun(Noun,TypeV,TypeS,F).
  293noun_template(Noun,Type,X,~P,Slots) :-
  294   thing(Noun,Type,X,P,Slots,_).
  295noun_template(Noun,TypeV,V,apply(F,P),
  296      [slot(prep(of),TypeX,X,_,apply)]) :-
  297   meta_noun(Noun,TypeV,V,TypeX,X,P,F).
  298
  299verb_template(have,Y=Z,
  300		[slot(subj,TypeS,S,-Id,free),
  301		 slot(dir,TypeV,Y,_,free),
  302		 slot(prep(of),TypeV,Z,_,free)],
  303		held_arg(poss,-(-(+Id)),TypeS-S), have).
  304verb_template(have,Y=Z,
  305	[slot(subj,TypeS,S,-(-(Id)),free),
  306	 slot(dir,TypeV,Y,_,free),
  307	 slot(prep(as),TypeV,Z,_,free)],
  308	held_arg(poss,-(-(-(+Id))),TypeS-S), have).
  309verb_template(Verb,Pred,
  310      [slot(subj,TypeS,S,_,free)|Slots],[],transparent) :-
  311   verb_type(Verb,_+Kind),
  312   verb_kind(Kind,Verb,TypeS,S,Pred,Slots).
  313
  314verb_kind(be,_,TypeS,S,S=A,[slot(dir,TypeS,A,_,free)]).
  315verb_kind(be,_,TypeS,S,true,[slot(pred,TypeS,S,_,free)]).
  316verb_kind(intrans,Verb,TypeS,S,Pred,Slots) :-
  317   intrans(Verb,TypeS,S,Pred,Slots,_).
  318verb_kind(trans,Verb,TypeS,S,Pred,
  319      [slot(dir,TypeD,D,SlotD,free)|Slots]) :-
  320   trans(Verb,TypeS,S,TypeD,D,Pred,Slots,SlotD,_).
  321% JW: commented out as ditrans/12 is not defined
  322%verb_kind(ditrans,Verb,TypeS,S,Pred,
  323%      [slot(dir,TypeD,D,SlotD,free),
  324%       slot(ind,TypeI,I,SlotI,free)|Slots]) :-
  325%   ditrans(Verb,TypeS,S,TypeD,D,TypeI,I,Pred,Slots,SlotD,SlotI,_).
  326
  327deepen_case(prep(at),time).
  328deepen_case(s_subj,dir).
  329deepen_case(s_subj,ind).
  330deepen_case(prep(by),subj).
  331deepen_case(prep(to),ind).
  332deepen_case(prep(of),poss).
  333deepen_case(X,X).
  334
  335% ================================================================
  336% Determiner Indexing Table
  337
  338index_slot(index,I,I).
  339index_slot(free,_,unit).
  340index_slot(apply,_,apply).
  341index_slot(comparator,_,comparator).
  342
  343index_args(det(the(plu)),unit,I,set(I),index(I)) :- !.
  344index_args(int_det(X),index(I),_,int_det(I,X),unit) :- !.
  345index_args(generic,apply,_,lambda,unit) :-!.
  346index_args(D,comparator,_,id,unit) :-
  347 ( indexable(D); D=generic), !.
  348index_args(D,unit,_,D,unit) :- !.
  349index_args(det(D),I,_,I,I) :-
  350   indexable(D),
  351   my_index(I), !.
  352index_args(D,I,_,D,I).
  353
  354indexable(the(plu)).
  355indexable(all).
  356
  357my_index(index(_I)).
  358
  359% ================================================================
  360% Utilities
  361
  362conc([],L,L).
  363conc([X|L1],L2,[X|L3]) :-
  364   conc(L1,L2,L3)