1/*
    2 _________________________________________________________________________
    3|	Copyright (C) 1982						  |
    4|									  |
    5|	David Warren,							  |
    6|		SRI International, 333 Ravenswood Ave., Menlo Park,	  |
    7|		California 94025, USA;					  |
    8|									  |
    9|	Fernando Pereira,						  |
   10|		Dept. of Architecture, University of Edinburgh,		  |
   11|		20 Chambers St., Edinburgh EH1 1JZ, Scotland		  |
   12|									  |
   13|	This program may be used, copied, altered or included in other	  |
   14|	programs only for academic purposes and provided that the	  |
   15|	authorship of the initial program is aknowledged.		  |
   16|	Use for commercial purposes without the previous written 	  |
   17|	agreement of the authors is forbidden.				  |
   18|_________________________________________________________________________|
   19
   20*/
   21
   22:-dynamic(adv_template_db/4).   23:-dynamic(ditrans_LF/12).   24:-dynamic(standard_adj_db/4).   25
   26:- op(450,xfy,((:))).   27:- op(400,xfy,((&))).   28:- op(300,fx,(('`'))).   29:- op(200,xfx,((--))).   30
   31
   32i_sentence(q(S),question80([],P)) :- !,
   33   i_s(S,P,[],0).
   34i_sentence(whq(X,S),question80([X],P)) :- !,
   35   i_s(S,P,[],0).
   36i_sentence(decl(S),assertion([],P)) :- !,
   37   i_s(S,P,[],0).
   38
   39i_sentence(imp(s(_,Verb,VArgs,VMods)),imp(V,Args)) :- !,
   40   i_verb(Verb,V,_,active,pos(_TFScope),Slots0,[],transparent),
   41   i_verb_args(VArgs,[],[],Slots0,Slots,Args,Args0,Up,-0),
   42   conc80(Up,VMods,Mods),
   43   i_verb_mods(Mods,_,[],Slots,Args0,Up,+0).
   44
   45i_sentence(S,assertion([],P)) :-
   46   i_s(S,P,[],0).
   47
   48i_np(there,Y,quant(void(_Meaning),_X,'`'(true),'`'(true),[],Y),[],_,_,XA,XA).
   49i_np(NP,Y,Q,Up,Id0,Index,XA0,XA) :-
   50   i_np_head(NP,Y,Q,Det,Det0,X,Pred,QMods,Slots0,Id0),
   51   held_arg(XA0,XA,Slots0,Slots,Id0,Id),
   52   i_np_rest(NP,Det,Det0,X,Pred,QMods,Slots,Up,Id,Index).
   53
   54i_np_head(np(_,Kernel,_),Y,
   55      quant(Det,T,Head,Pred0,QMods,Y),
   56      Det,Det0,X,Pred,QMods,Slots,_Id) :-
   57   no_repeats_must(i_np_head0(Kernel,X,T,Det0,Head,Pred0,Pred,Slots)),
   58   Type-_=Y, Type-_=T,!.
   59
   60i_np_head(np(Argree2B,C,MoreIn),Y,Quant,Det,Det0,X,Pred,QMods,Slots0,Id0):- t_l:chat80_interactive,!,
   61  trace,pronoun_LF(Argree2B,C,MoreIn,X,Y,MoreOut,PronounType),
   62  i_np_head(np(Argree2B,np_head(generic,MoreOut,PronounType),MoreIn),Y,Quant,Det,Det0,X,Pred,QMods,Slots0,Id0).
   63
   64i_np_head(Argree2B,Y,Quant,Det,Det0,X,Pred,QMods,Slots0,Id0):- t_l:chat80_interactive,!,
   65  trace,pronoun_LF(Argree2B,[],[],X,Y,MoreOut,PronounType),
   66  i_np_head(np(Argree2B,np_head(generic,MoreOut,PronounType),MoreOut),Y,Quant,Det,Det0,X,Pred,QMods,Slots0,Id0).
   67
   68i_np_rest(np(_,_,Mods),Det,Det0,X,Pred,QMods,Slots,Up,Id,Index) :-
   69   index_args(Det0,Index,Id,Det,IndexA),
   70   i_np_mods(Mods,X,Slots,Pred,QMods,Up,Id,IndexA).
   71
   72held_arg(held_arg(Case,-Id,X),[],S0,S,Id,+Id) :-
   73   in_slot(S0,Case,X,Id,S,_).
   74held_arg(XA,XA,S,S,Id,Id).
   75
   76i_np_head0(np_head(Det,Adjs,Noun),X,T,Det,Head0,Pred0,Pred,Slots) :-
   77   i_adjs(Adjs,X,T,X,Head0,Head,Pred0,Pred),
   78   i_noun(Noun,X,Head,Slots).
   79i_np_head0(np_head(int_det(V),Adjs,Noun),
   80      Type-X,Type-X,Det,'`'(true),Pred,Pred,
   81      [slot(prep(of),Type,X,_,comparator)]) :-
   82   comparator_db(Noun,Type,V,Adjs,Det).
   83i_np_head0(np_head(quant(Op0,N),Adjs,Noun),
   84      Type-X,Type-X,void(_Meaning),'`'(P),Pred,Pred,[]) :-
   85   measure_unit_type_db(Noun,Type,Adjs,Units),
   86   pos_conversion_db(N,Op0,Type,V,Op),
   87   measure_op_db(Op,X,V--Units,P).
   88i_np_head0(nameOf(Name),
   89      Type-Name,Type-Name,id(_Why),'`'(true),Pred,Pred,[]) :-
   90   no_repeats(name_template_db(Name,Type)). %leave singltom so i can rembm er to come back to it
   91i_np_head0(wh(X),X,X,id(_Why),'`'(true),Pred,Pred,[]).
   92
   93%i_np_mods([],_,[],'`'(true),[],[],_,_).
   94i_np_mods(Mods,_,[],'`'(true),[],Mods,_,_).
   95i_np_mods([Mod|Mods],X,Slots0,Pred0,QMods0,Up,Id,Index) :-
   96   i_np_mod(Mod,X,Slots0,Slots,
   97            Pred0,Pred,QMods0,QMods,Up0,-Id,Index),
   98   conc80(Up0,Mods,Mods0),
   99   i_np_mods(Mods0,X,Slots,Pred,QMods,Up,+Id,Index).
  100i_np_mods(Mods,_,[Slot|Slots],'`'(true),QMods,Mods,Id,_) :-
  101   i_voids([Slot|Slots],QMods,Id).
  102
  103i_voids([],[],_).
  104i_voids([Slot|Slots],[quant(void(_Meaning),X,'`'(true),'`'(true),[],_)|QMods],Id) :-
  105   slot_tag(Slot,X,-Id), !,
  106   i_voids(Slots,QMods,+Id).
  107i_voids([_|Slots],QMods,Id) :-
  108   i_voids(Slots,QMods,Id).
  109
  110i_rel(rel(X,S),X,P&Pred,Pred,QMods,QMods,Up,Id) :-
  111   i_s(S,P,Up,Id).
  112i_rel(reduced_rel(X,S),X,Pred,Pred,[A|QMods],QMods,Up,Id) :-
  113   i_s(S,A,Up,Id).
  114i_rel(conj(Conj,Left,Right),X,
  115      conj(Conj,LPred,LQMods,RPred,RQMods)&Pred,Pred,
  116      QMods,QMods,Up,Id) :-
  117   i_rel(Left,X,LPred,'`'(true),LQMods,[],[],-Id),
  118   i_rel(Right,X,RPred,'`'(true),RQMods,[],Up,+Id).
  119
  120i_np_mod(pp(Prep,NP),
  121      X,Slots0,Slots,Pred,Pred,[QMod|QMods],QMods,Up,Id0,Index0) :-
  122   i_np_head(NP,Y,Q,LDet,LDet0,LX,LPred,LQMods,LSlots0,Id0),
  123   i_bind(Prep,Slots0,Slots1,X,Y,Id0,Function,P,PSlots,XArg),
  124   conc80(PSlots,Slots1,Slots),
  125   i_np_modify(Function,P,Q,QMod,Index0,Index),
  126   held_arg(XArg,[],LSlots0,LSlots,Id0,Id),
  127   i_np_rest(NP,LDet,LDet0,LX,LPred,LQMods,LSlots,Up,Id,Index).
  128i_np_mod(Mod,X,Slots,Slots,Pred0,Pred,QMods0,QMods,Up,Id,_) :-
  129   i_rel(Mod,X,Pred0,Pred,QMods0,QMods,Up,Id).
  130
  131%i_noun(Noun,Type-X,P,Slots) :-
  132%   no_repeats(must(noun_template(Noun,Type,X,P,Slots))).
  133i_noun(Noun,Type-X,P,Slots) :-
  134   no_repeats(must(noun_template(Noun,Type,X,P,Slots))).
  135
  136i_bind(Prep,Slots0,Slots,_,X,Id,varg,P,[],[]) :-
  137   in_slot(Slots0,Case,X,Id,Slots,P),
  138   deepen_case(Prep,Case).
  139i_bind(prep(Prep),Slots,Slots,X,Y,_,adjoin,'`'(P),PSlots,XArg) :-
  140   i_adjoin(Prep,X,Y,PSlots,XArg,P).
  141
  142i_np_modify(adjoin,P,N,N & P,_,unit).
  143i_np_modify(varg,F,N,N,Index0,Index) :-
  144   index_slot(F,Index0,Index).
  145
  146in_slot([Slot|Slots],Case,X,Id,Slots,F) :-
  147   slot_match(Slot,Case,X,Id,F).
  148in_slot([Slot|Slots0],Case,X,Id,[Slot|Slots],F) :-
  149   in_slot(Slots0,Case,X,Id,Slots,F).
  150
  151slot_match(slot(Case,Type,X,Id,F),Case,Type-X,Id,F).
  152
  153i_adjs([],_X,T,T,Head,Head,Pred,Pred).
  154i_adjs([Adj|Adjs],X,T,T0,Head0,Head,Pred0,Pred) :-
  155   i_adj(Adj,X,T,T1,Head0,Head1,Pred0,Pred1),
  156   i_adjs(Adjs,X,T1,T0,Head1,Head,Pred1,Pred).
  157
  158i_adj(adj(Adj),Type-X,T,T,Head,Head,'`'(P)&Pred,Pred) :-
  159   no_repeats_must(deduce_subject_LF(restriction,Adj,Type,X,P)).
  160i_adj(adj(Adj),TypeX-X,TypeV-V,_,
  161   aggr(F,V,[X],Head,Pred),Head,'`'(true),Pred) :-
  162   aggr_adj_db(Adj,TypeV,TypeX,F).
  163i_adj(sup(Op0,adj(Adj)),Type-X,Type-V,_,
  164      aggr(F,V,[Y,X],Head,'`'(P)&Pred),Head,'`'(true),Pred) :-
  165   adj_sign_db(Adj,Sign),
  166   inverse_db(Op0,Sign,Op),
  167   i_sup_op(Op,F),
  168   no_repeats_must(deduce_subj_obj_LF(attribute,Adj,Type,X,_,Y,P)).
  169i_adj(adj(Adj),TypeX-X,T,T,_,
  170      Head,Head,quant(void(_Meaning),TypeX-Y,'`'(P),'`'(Q)&Pred,[],_),Pred) :-
  171   no_repeats_must(deduce_subj_obj_LF(attribute,Adj,TypeX,X,_,Y,P)),
  172   standard_adj_db(Adj,TypeX,Y,Q).
  173
  174i_s('s'(Subj,Verb,VArgs,VMods),Pred,Up,Id) :-
  175   i_verb(Verb,P,Tense,Voice,Neg,Slots0,XA0,Meta),
  176   i_subj(Voice,Subj,Slots0,Slots1,QSubj,SUp,'-'('-'(Id))),
  177   conc80(SUp,VArgs,TArgs),
  178   i_verb_args(TArgs,XA0,XA,Slots1,Slots,Args0,Args,Up0,'+'('-'(Id))),
  179   conc80(Up0,VMods,Mods),
  180   i_verb_mods(Mods,Tense,XA,Slots,Args,Up,+Id),
  181   reshape_pred(Meta,QSubj,Neg,P,Args0,Pred).
  182
  183i_verb(verb(Root,Voice,Tense,_Aspect,Neg),
  184      P,Tense,Voice,Det,Slots,XArg,Meta) :-
  185   slot_verb_template(Root,P,Slots,XArg,Meta),
  186   i_neg(Neg,Det).
  187
  188reshape_pred(transparent,S,N,P,A,pred(S,N,P,A)).
  189reshape_pred(have,Subj,Neg,Verb0,
  190      [quant(Det,X,Head0,Pred,QArgs,Y)|MRest],
  191      pred(Subj,Neg,Verb,[quant(Det,X,Head,Pred,QArgs,Y)|MRest])) :-
  192   have_pred(Head0,Verb0,Head,Verb).
  193
  194have_pred('`'(Head),Verb,'`'(true),(Head,Verb)).
  195have_pred(Head,Verb,Head,Verb) :-
  196   meta_head(Head).
  197
  198meta_head(apply(_,_)).
  199meta_head(aggr(_,_,_,_,_)).
  200
  201i_neg(pos(V),id(V)).
  202i_neg(neg(V),not(V)).
  203
  204i_subj(Voice,Subj,Slots0,Slots,Quant,Up,Id) :-
  205   active_passive_subjcase(Voice,Case),
  206   verb_slot(varg(Case,Subj),[],[],Slots0,Slots,[Quant],[],Up,Id).
  207
  208i_verb_args(VArgs,XA0,XA,Slots0,Slots,Args0,Args,Up,Id) :-
  209   fill_verb(VArgs,XA0,XA,Slots0,Slots,Args0,Args,Up,Id).
  210
  211active_passive_subjcase(active,subj80).
  212active_passive_subjcase(passive,s_subj).
  213
  214fill_verb([],XA,XA,Slots,Slots,Args,Args,[],_).
  215fill_verb([Node|Nodes0],XA0,XA,Slots0,Slots,Args0,Args,Up,Id) :-
  216   verb_slot(Node,XA0,XA1,Slots0,Slots1,Args0,Args1,Up0,-Id),
  217   conc80(Up0,Nodes0,Nodes),
  218   fill_verb(Nodes,XA1,XA,Slots1,Slots,Args1,Args,Up,+Id).
  219
  220verb_slot(pp(Prep,NP),
  221      XArg0,XArg,Slots0,Slots,[Q|Args],Args,Up,Id) :-
  222   i_np(NP,X,Q,Up,Id,unit,XArg0,XArg),
  223   in_slot(Slots0,Case,X,Id,Slots,_),
  224   deepen_case(Prep,Case).
  225verb_slot(void(_Meaning),XA,XA,Slots,Slots,Args,Args,[],_) :-
  226   in_slot(Slots,pred,_,_,_,_).
  227verb_slot(pp(prep(Prep),NP),
  228      TXArg,TXArg,Slots0,Slots,[Q& '`'(P)|Args],Args,Up,Id0) :-
  229   in_slot(Slots0,pred,X,Id0,Slots1,_),
  230   i_adjoin(Prep,X,Y,PSlots,XArg,P),
  231   i_np_head(NP,Y,Q,LDet,LDet0,LX,LPred,LQMods,LSlots0,Id0),
  232   held_arg(XArg,[],LSlots0,LSlots,Id0,Id),
  233   i_np_rest(NP,LDet,LDet0,LX,LPred,LQMods,LSlots,Up,Id,free),
  234   conc80(PSlots,Slots1,Slots).
  235verb_slot(varg(SCase,NP),
  236      XArg0,XArg,Slots0,Slots,[Q|Args],Args,Up,Id) :-
  237   i_np(NP,X,Q,Up,Id,unit,XArg0,XArg),
  238   in_slot(Slots0,Case,X,Id,Slots,_),
  239   deepen_case(SCase,Case).
  240verb_slot(adverb(Adv),XA,XA,Slots0,Slots,['`'(P)|Args],Args,[],Id) :-
  241   no_repeats(adv_template_db(Adv,Case,X,P)),
  242   in_slot(Slots0,Case,X,Id,Slots,_).
  243verb_slot(varg(pred,AP),XA,XA,Slots0,Slots,Args0,Args,Up,Id) :-
  244   in_slot(Slots0,pred,X,Id,Slots,_),
  245   i_pred(AP,X,Args0,Args,Up,Id).
  246
  247i_pred(conj(Conj,Left,Right),X,
  248      [conj(Conj,'`'(true),LQMods,'`'(true),RQMods)|QMods],
  249      QMods,Up,Id) :-
  250   i_pred(Left,X,LQMods,[],[],-Id),
  251   i_pred(Right,X,RQMods,[],Up,+Id).
  252i_pred(AP,T,['`'(Head)&Pred|As],As,[],_) :-
  253   i_adj(AP,T,_,_,Head,true,Pred,'`'(true)).
  254i_pred(value(adj(Adj),wh(TypeY-Y)),Type-X,['`'(H)|As],As,[],_) :-
  255   no_repeats(deduce_subj_obj_LF(attribute,Adj,Type,X,TypeY,Y,H)).
  256i_pred(comp(Op0,adj(Adj),NP),X,[P1 & P2 & '`'(P3),Q|As],As,Up,Id) :-
  257   i_np(NP,Y,Q,Up,Id,unit,[],[]),
  258   adj_sign_db(Adj,Sign),
  259   i_measure(X,Adj,Type,U,P1),
  260   i_measure(Y,Adj,Type,V,P2),
  261   inverse_db(Op0,Sign,Op),
  262   measure_op_db(Op,U,V,P3).
  263i_pred(pp(prep(Prep),NP),X,['`'(H),Q|As],As,Up,Id) :-
  264   i_np(NP,Y,Q,Up,Id,unit,[],[]),
  265   adjunction_lf(Prep,X,Y,H).
  266
  267i_adjoin(with,TS-S,TV-Y,[slot(prep(of),TV,Z,_,free)],
  268	held_arg(poss,-_Id,TS-S),
  269	Y=Z).
  270i_adjoin(Prep,X,Y,[],[],P) :-
  271   no_repeats(adjunction_lf(Prep,X,Y,P)).
  272
  273i_measure(Type-X,Adj,Type,X,'`'(true)) :-
  274   no_repeats(units_db(Adj,Type)).
  275i_measure(TypeX-X,Adj,TypeY,Y,quant(void(_There),TypeY-Y,'`'(P),'`'(true),[],_)) :-
  276   no_repeats_must(deduce_subj_obj_LF(attribute,Adj,TypeX,X,TypeY,Y,P)).
  277
  278i_verb_mods(Mods,_,XA,Slots0,Args0,Up,Id) :-
  279   fill_verb(Mods,XA,[],Slots0,Slots,Args0,Args,Up,-Id),
  280   i_voids(Slots,Args,+Id).
  281
  282slot_tag(slot(_,Type,X,Id,_),Type-X,Id).
  283
  284i_sup_op(least,min).
  285i_sup_op(most,max).
  286
  287pos_conversion_db(wh(Type-X),same,Type,X,id(_Why)).
  288pos_conversion_db(nquant(N),Op,_,N,Op).
  289
  290
  291noun_template(Noun,TypeV,V,'`'(P),
  292      [slot(poss,TypeO,O,Os,index)|Slots]) :-
  293   no_repeats_must(deduce_subj_obj_LF(property,Noun,TypeV,V,TypeO,O,P)),Slots=[],Os=_.
  294noun_template(Noun,TypeV,V,aggr(F,V,[],'`'(true),'`'(true)),
  295   [slot(prep(of),TypeS,_,_,free)]) :-
  296   aggr_noun_db(Noun,TypeV,TypeS,F).
  297noun_template(Noun,Type,X,'`'(P),Slots) :-
  298   no_repeats_must(deduce_subject_LF(thing,Noun,Type,X,P)),Slots=[].
  299noun_template(Noun,TypeV,V,apply(F,P),
  300      [slot(prep(of),TypeX,X,_,apply)]) :-
  301   meta_noun_db(Noun,TypeV,V,TypeX,X,P,F).
  302
  303slot_verb_template(have,Y=Z,
  304		[slot(subj80,TypeS,S,-Id,free),
  305		 slot(dir,TypeV,Y,_,free),
  306		 slot(prep(of),TypeV,Z,_,free)],
  307		held_arg(poss,-(-(+Id)),TypeS-S), have).
  308slot_verb_template(have,Y=Z,
  309	[slot(subj80,TypeS,S,-(-(Id)),free),
  310	 slot(dir,TypeV,Y,_,free),
  311	 slot(prep(as),TypeV,Z,_,free)],
  312	held_arg(poss,-(-(-(+Id))),TypeS-S), have).
  313slot_verb_template(Verb,Pred,
  314      [slot(subj80,TypeS,S,_,free)|Slots],[],transparent) :-
  315   no_repeats_must(verb_type_db(Verb,_+Kind)),!,
  316   slot_verb_kind(Kind,Verb,TypeS,S,Pred,Slots).
  317
  318slot_verb_kind(be,_,TypeS,S,S=A,[slot(dir,TypeS,A,_,free)]).
  319slot_verb_kind(be,_,TypeS,S,true,[slot(pred,TypeS,S,_,free)]).
  320slot_verb_kind(iv,Verb,TypeS,S,Pred,Slots) :-
  321   intrans_LF(Verb,TypeS,S,Pred,Slots,_).
  322slot_verb_kind(tv,Verb,TypeS,S,Pred,
  323      [slot(dir,TypeD,D,SlotD,free)|Slots]) :-
  324   no_repeats_must(trans_LF(Verb,TypeS,S,TypeD,D,Pred,Slots,SlotD,_)).
  325slot_verb_kind(ditrans(_Prep),Verb,TypeS,S,Pred,
  326      [slot(dir,TypeD,D,SlotD,free),
  327       slot(ind,TypeI,I,SlotI,free)|Slots]) :-
  328   ditrans_LF(Verb,TypeS,S,TypeD,D,TypeI,I,Pred,Slots,SlotD,SlotI,_).
  329
  330deepen_case(prep(at),time).
  331deepen_case(s_subj,dir).
  332deepen_case(s_subj,ind).
  333deepen_case(prep(by),subj80).
  334deepen_case(prep(to),ind).
  335deepen_case(prep(of),poss).
  336deepen_case(X,X).
  337
  338% ================================================================
  339% Determiner Indexing Table
  340
  341index_slot(index,I,I).
  342index_slot(free,_,unit).
  343index_slot(apply,_,apply).
  344index_slot(comparator,_,comparator).
  345
  346index_args(det(the(pl)),unit,I,set(I),index(I)) :- !.
  347index_args(int_det(X),index(I),_,int_det(I,X),unit) :- !.
  348index_args(generic,apply,_,lambda,unit) :-!.
  349index_args(D,comparator,_,id(_Why),unit) :-
  350 ( indexable(D); D=generic), !.
  351index_args(D,unit,_,D,unit) :- !.
  352index_args(det(D),I,_,I,I) :-
  353   indexable(D),
  354   index80(I), !.
  355index_args(D,I,_,D,I).
  356
  357indexable(the(pl)).
  358indexable(all).
  359
  360index80(index(_I)).
  361
  362% ================================================================
  363% Utilities
  364
  365conc80([],L,L).
  366conc80([X|L1],L2,[X|L3]) :-
  367   conc80(L1,L2,L3)