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