2:- ensure_loaded(semlib(errors)).    3/* -------------------------------------------------------------------------
    4   Expletive 'there' and other "special" nouns
    5------------------------------------------------------------------------- */
    6
    7semlex(n,many,Index,Att-[sem:'QUA'|Att],Sem):-
    8   att(Att,pos,'NN'), !,
    9   Sem = lam(X,B:drs([],[B:Index:pred(X,quantity,n,1)])).
   10
   11semlex(n,much,Index,Att-[sem:'QUA'|Att],Sem):-
   12   att(Att,pos,'NN'), !,
   13   Sem = lam(X,B:drs([],[B:Index:pred(X,amount,n,3)])).
   14
   15semlex(n,there,Index,Att-[sem:'UNK'|Att],Sem):-
   16   att(Att,pos,'EX'), !,
   17   Sem = lam(X,B:drs([B:[]:Y],[B:Index:pred(Y,location,n,1),
   18                               B:[]:rel(Y,X,rel,0)])).
   19
   20
   21/* -------------------------------------------------------------------------
   22   Nouns
   23------------------------------------------------------------------------- */
   24
   25semlex(n,other,Index,Att-[sem:'ALT'|Att],Sem):-       % OTHERS
   26   \+ option('--semantics',drg), 
   27   att(Att,pos,'NNS'), !,
   28   Sem = lam(X,merge(B0:drs([],[B0:Index:pred(X,person,n,1)]),
   29                     alfa(def,
   30                          B1:drs([B1:[]:Y],[B1:[]:pred(Y,person,n,1)]),
   31                          B2:drs([],[B2:[]:not(B3:drs([],[B3:[]:eq(X,Y)]))])))).
   32
   33semlex(n,Sym,Index,Att-[sem:'DOM'|Att],Sem):-         % DAY OF MONTH
   34   att(Att,pos,Pos),
   35   member(Pos,['CD','NNP','NN']),
   36   att(Att,namex,NE), neClass(NE,tim),
   37   dofm(Sym,DID), !,
   38   Sem = lam(X,B:drs([],[B:Index:timex(X,date([]:'+',[]:'XXXX',[]:'XX',Index:DID))])).
   39
   40semlex(n,Sym,Index,Att-[sem:'YOC'|Att],Sem):-         % YEAR
   41   att(Att,pos,'CD'),
   42   att(Att,namex,NE), neClass(NE,tim),
   43   year(Sym,Year), !,
   44   Sem = lam(X,B:drs([],[B:Index:timex(X,date([]:'+',Index:Year,[]:'XX',[]:'XX'))])).
   45
   46semlex(n,Sym,Index,Att-[sem:'MOY'|Att],Sem):-         % MONTH
   47   att(Att,pos,'CD'),
   48   att(Att,namex,NE), neClass(NE,tim),
   49   month(Sym,MID), !,
   50   Sem = lam(X,B:drs([],[B:Index:timex(X,date([]:'+',[]:'XXXX',Index:MID,[]:'XX'))])).
   51
   52semlex(n,Sym,Index,Att-[sem:'MOY'|Att],Sem):-         % MONTH
   53   att(Att,pos,'NNP'),
   54   att(Att,namex,NE), neClass(NE,tim),
   55   month(Sym,MID), !,
   56   Sem = lam(X,B:drs([],[B:Index:timex(X,date([]:'+',[]:'XXXX',Index:MID,[]:'XX'))])).
   57
   58semlex(n,Sym,Index,Att1-[sem:'GPE'|Att2],Sem):-       % GPE-NOUNS
   59   att(Att1,namex,'gpe-nam'), 
   60   ( att(Att1,pos,'NNS');  att(Att1,pos,'NN') ), !,
   61   rel(from,Att1-Att2,Relation),
   62   Sem = lam(X,B:drs([B:[]:Y],[B:Index:pred(X,person,n,1),
   63                               B:[]:named(Y,Sym,gpe,nam),
   64                               B:[]:rel(X,Y,Relation,1)])).
   65
   66semlex(n,Sym,Index,Att-[sem:'DEC'|Att],Sem):-         % DECADE
   67   att(Att,pos,'NNS'),
   68   decade(Sym,DID), !,
   69   Sem = lam(X,B:drs([],[B:Index:timex(X,date([]:'+',Index:DID,[]:'XX',[]:'XX'))])).
   70
   71semlex(n,Sym,Index,Att-[sem:'SCO'|Att],Sem):-         % SCORE
   72   att(Att,pos,'CD'),
   73   string2score(Sym,Score), !,
   74   Sem = lam(X,B:drs([],[B:Index:named(X,Score,sco,num)])).  % preliminary representation
   75
   76semlex(n,Sym,Index,Att-[sem:'QUA'|Att],Sem):-         % QUANTITY
   77   att(Att,pos,'CD'),
   78   string2digit(Sym,Digit), !,
   79   Sem = lam(X,B:drs([],[B:Index:card(X,Digit,eq),B:[]:pred(X,thing,n,12)])).
   80
   81semlex(n,Sym,Index,Att-[sem:Tag|Att],Sem):-         % NAME (SG)
   82   att(Att,pos,'NNP'), !,
   83   att(Att,namex,NE), neClassType(NE,Class,Type,Tag),
   84   Sem = lam(X,B:drs([],[B:Index:named(X,Sym,Class,Type)])).
   85
   86semlex(n,Sym,Index,Att-[sem:Tag|Att],Sem):-         % NAME (PL)
   87   att(Att,pos,'NNPS'), !,
   88   att(Att,namex,NE), neClassType(NE,Class,Type,Tag),
   89   Sem = lam(X,B:drs([],[B:Index:named(X,Sym,Class,Type)])).
   90
   91semlex(n,most,Index,Att-[sem:'TOP'|Att],Sem):- 
   92   att(Att,pos,'JJS'), !,
   93   att(Att,sense,Sense),
   94   Sem = lam(X,B:drs([],[B:Index:pred(X,most,n,Sense)])).
   95
   96semlex(n,Sym,Index,Att-[sem:'TOP'|Att],Sem):-
   97   att(Att,pos,'JJS'),
   98%   option('--semantics',amr),
   99   !,
  100   att(Att,sense,Sense),
  101   Sem = lam(X,B:drs([],[B:Index:pred(X,Sym,n,Sense),B:[]:pred(X,most,r,1)])).
  102
  103semlex(n,Sym,Index,Att-[sem:'TOP'|Att],Sem):- 
  104   \+ option('--semantics',drg),
  105   \+ option('--semantics',amr),
  106   att(Att,pos,'JJS'), !,
  107   Sem = lam(X,B1:drs([],[B1:[]:imp(B2:drs([B2:[]:Y],[B2:[]:not(B3:drs([],[B3:[]:eq(Y,X)]))]),B4:drs([],[B4:Index:rel(X,Y,Sym,0)]))])).
  108
  109%semlex(n,Sym,_,Index,Att-[sem:'UNK'|Att],Sem):- 
  110%   option('--x',true),
  111%   negprefix(_, Sym, Prefix, Core), !,
  112%   Sem = lam(X,B1:drs([],[B1:Index:not(B2:drs([],[B2:Index:pred(X,Prefix,n,71),B2:Index:pred(X,Core,n,1)]))])).
  113
  114%semlex(n,Sym,_,Index,Att-[sem:'UNK'|Att],Sem):- 
  115%   option('--x',true),
  116%   negsuffix(_, Sym, Suffix, Core), !,
  117%   Sem = lam(X,B1:drs([],[B1:Index:not(B2:drs([],[B2:Index:pred(X,Suffix,n,72),B2:Index:pred(X,Core,n,1)]))])).
  118
  119semlex(n,Sym,Index,Att-[sem:'CON'|Att],Sem):-
  120   option('--plural',true),
  121   att(Att,pos,'NNS'), !,
  122   att(Att,sense,Sense),
  123   Sem = lam(X,B:drs([],[B:Index:pred(X,Sym,n,Sense),B:[]:card(X,2,ge)])).
  124
  125semlex(n,Sym,Index,Att-[sem:'CON'|Att],Sem):- !,
  126   att(Att,sense,Sense),
  127   Sem = lam(X,B:drs([],[B:Index:pred(X,Sym,n,Sense)])).
  128
  129
  130/* -------------------------------------------------------------------------
  131   Relational nouns
  132------------------------------------------------------------------------- */
  133
  134semlex(n/pp,Sym,Index,Att-[sem:'ROL'|Att],Sem):-
  135   att(Att,pos,Pos), 
  136   member(Pos,['NNP','NNPS']), !,
  137   att(Att,namex,NE), neClassType(NE,Class,Type),
  138   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:named(X,Sym,Class,Type)]),
  139                           app(P,X)))).
  140
  141
  142semlex(n/pp,Sym,Index,Att-[sem:'ROL'|Att],Sem):- !,
  143   att(Att,sense,Sense),
  144   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,n,Sense)]),
  145                           app(P,X)))).
  146
  147semlex(n/pp,Sym,Index,Att1-[sem:'ROL'|Att2],Sem):- 
  148   att(Att1,sense,Sense),
  149   roles(play,(s:dcl\np)/np,[_,Role],Att1-Att2), !,
  150   Sem = lam(P,lam(X,merge(B:drs([[]:Y],
  151                               [B:Index:pred(Y,Sym,n,Sense),
  152                                B:[]:role(X,Y,Role,1),
  153                                B:[]:pred(X,person,n,1)]),
  154                           app(P,Y)))).
  155
  156semlex((n/pp)/pp,Sym,Index,Att-[sem:'ROL'|Att],Sem):- !,
  157   att(Att,sense,Sense),
  158   Sem = lam(P1,lam(P2,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,n,Sense)]),
  159                                   merge(app(P1,X),app(P2,X)))))).
  160
  161semlex(((n/pp)/pp)/pp,Sym,Index,Att-[sem:'ROL'|Att],Sem):- !,
  162   att(Att,sense,Sense),
  163   Sem = lam(P1,lam(P2,lam(P3,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,n,Sense)]),
  164                                          merge(app(P1,X),merge(app(P2,X),app(P3,X)))))))).
  165
  166semlex(n/(s:_\np),Sym,Index,Att-[sem:'CON'|Att],Sem):- !,
  167   att(Att,sense,Sense),
  168   closing(CC),
  169   Sem = lam(VP,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,n,Sense)]),
  170                            app(app(VP,lam(P,app(P,X))),CC)))).
  171
  172semlex((n/(s:_\np))/pp,Sym,Index,Att-[sem:'ROL'|Att],Sem):- !,
  173   att(Att,sense,Sense),
  174   closing(CC),
  175   Sem = lam(P,lam(VP,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,n,Sense)]),
  176                                  merge(app(app(VP,lam(P,app(P,X))),CC),
  177                                        app(P,X)))))).
  178
  179semlex((n/pp)/(s:_\np),Sym,Index,Att-[sem:'ROL'|Att],Sem):- !,
  180   att(Att,sense,Sense),
  181   closing(CC),
  182   Sem = lam(VP,lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,n,Sense)]),
  183                                  merge(app(app(VP,lam(P,app(P,X))),CC),
  184                                        app(P,X)))))).
  185
  186
  187/* =========================================================================
  188   Adjectives
  189========================================================================= */
  190
  191/* -------------------------------------------------------------------------
  192   Wrongly Classified Adjectives + "own"
  193------------------------------------------------------------------------- */
  194
  195semlex(n/n,Sym,Index,Att-[sem:'NIL'|Att],Sem):-
  196   att(Att,pos,'DT'), !,
  197   warning('wrongly classified determiner ~p at ~p',[Sym,Index]),
  198   Sem = lam(P,lam(X,app(P,X))).
  199
  200semlex(Cat,many,Index,Att-[sem:'QUA'|Att],Sem):-
  201   cat(Cat,n|n), !,
  202   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,quantity,n,1)]),app(P,X)))).
  203
  204semlex(Cat,much,Index,Att-[sem:'QUA'|Att],Sem):-
  205   cat(Cat,n|n), !,
  206   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,amount,n,3)]),app(P,X)))).
  207
  208semlex(Cat,only,Index,Att-[sem:'EXC'|Att],Sem):- 
  209   cat(Cat,n|n), !,
  210   \+ option('--semantics',amr), !,
  211   Sem = lam(P,lam(X,merge(app(P,X),B1:drs([],[B1:[]:imp(merge(B2:drs([B2:Index:Y],[]),app(P,Y)),B3:drs([],[B3:[]:eq(X,Y)]))])))).
  212
  213
  214/* -------------------------------------------------------------------------
  215   Negation Adjectives
  216
  217semlex(Cat,Sym,Index,Att-[sem:'NOT'|Att],Sem):-
  218   cat(Cat,n|n), 
  219   option('--semantics',amr),
  220   negprefix(_, Sym, _Prefix, Core), !,
  221   Sem = lam(P,lam(X,merge(B1:drs([],[B1:Index:not(B2:drs([B2:[]:E],[B2:[]:rel(E,X,invmod,1),
  222                                                                     B2:Index:pred(E,Core,a,1)]))]),app(P,X)))).
  223
  224semlex(Cat,Sym,Index,Att-[sem:'NOT'|Att],Sem):-
  225   cat(Cat,n|n), 
  226   option('--semantics',amr),
  227   negsuffix(_, Sym, _Suffix, Core), !,
  228   Sem = lam(P,lam(X,B1:drs([],[B1:Index:not(merge(B2:drs([B2:[]:E],[B2:[]:rel(X,E,mod,1),
  229                                                                     B2:Index:pred(E,Core,a,1)]),app(P,X)))]))).
  230------------------------------------------------------------------------- */
  231
  232
  233/* -------------------------------------------------------------------------
  234   Presuppositional Adjectives
  235------------------------------------------------------------------------- */
  236
  237semlex(Cat,Sym,Index,Att-[sem:'ALT'|Att],Sem):-
  238   \+ option('--semantics',drg), 
  239   \+ option('--semantics',amr), 
  240   member(Sym,[other,previous,different]),
  241   cat(Cat,n|n), !,
  242   Sem = lam(P,lam(X,merge(app(P,X),
  243                           alfa(def,
  244                                merge(B1:drs([B1:[]:Y],[]),app(P,Y)),
  245                                      B2:drs([],[B2:[]:not(B3:drs([],[B3:Index:eq(X,Y)]))]))))).
  246
  247
  248/* -------------------------------------------------------------------------
  249   Present participles, Gerunds
  250------------------------------------------------------------------------- */
  251
  252semlex(Cat,Sym,Index,Att1-[sem:'EXG'|Att2],Sem):-
  253   cat(Cat,n|n), 
  254   att(Att1,pos,'VBG'), 
  255   roles(Sym,s:dcl\np,[Role],Att1-Att2), !,
  256   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],
  257                                 [B:Index:pred(E,Sym,v,0),
  258                                  B:[]:role(X,E,Role,-1)]), 
  259                           app(P,X)))).
  260
  261
  262/* -------------------------------------------------------------------------
  263   Past Participles
  264------------------------------------------------------------------------- */
  265
  266semlex(Cat,Sym,Index,Att1-[sem:'EXT'|Att2],Sem):-
  267   cat(Cat,n|n), 
  268   att(Att1,pos,'VBN'), 
  269   roles(Sym,s:pss\np,[Role],Att1-Att2), !,
  270   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],
  271                                 [B:Index:pred(E,Sym,v,0),
  272                                  B:[]:role(X,E,Role,-1)]), 
  273                           app(P,X)))).
  274
  275
  276/* -------------------------------------------------------------------------
  277   Noun Noun Compounds
  278------------------------------------------------------------------------- */
  279
  280semlex(Cat,'%',Index,Att1-['UOM'|Att2],Sem):-
  281   att(Att1,pos,'NN'),
  282   cat(Cat,n|n), !,
  283   semlex(Cat,percent,Index,Att1-Att2,Sem).
  284
  285semlex(Cat,Sym,Index,Att-[sem:'UOM'|Att],Sem):- 
  286   cat(Cat,n|n),
  287   att(Att,pos,'$'), !,
  288   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,n,1)]),app(P,X)))).
  289
  290semlex(Cat,'&',Index,Att-[sem:'ORG'|Att],Sem):- 
  291   cat(Cat,n|n),
  292   att(Att,namex,Ne), neClassType(Ne,org,Type), !,
  293   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:named(X,'&',org,Type)]),
  294                           app(P,X)))).
  295
  296semlex(Cat,Sym,Index,Att-[sem:'SCO'|Att],Sem):- 
  297   att(Att,pos,'CD'),
  298   cat(Cat,n|n),
  299   string2score(Sym,Score), !,
  300   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:named(X,Score,sco,num)]),
  301                           app(P,X)))).
  302
  303semlex(Cat,Sym,Index,Att-[sem:'DOM'|Att],Sem):- 
  304   att(Att,pos,'CD'),
  305   att(Att,namex,NE), neClass(NE,tim),
  306   cat(Cat,n|n),
  307   dofm(Sym,DID), !,
  308   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:timex(X,date([]:'+',[]:'XXXX',[]:'XX',Index:DID))]),
  309                           app(P,X)))).
  310
  311semlex(Cat,Sym,Index,Att-[sem:'MOY'|Att],Sem):- 
  312   att(Att,pos,'NNP'),
  313   att(Att,namex,NE), neClass(NE,tim),
  314   cat(Cat,n|n),
  315   month(Sym,MID), !,
  316   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:timex(X,date([]:'+',[]:'XXXX',Index:MID,[]:'XX'))]),
  317                           app(P,X)))).
  318
  319semlex(Cat,YID,Index,Att-[sem:'YOC'|Att],Sem):- 
  320   att(Att,pos,'CD'),
  321   att(Att,namex,NE),
  322   neClass(NE,tim),
  323   cat(Cat,n|n),
  324   year(YID,Year), !,
  325   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:timex(X,date([]:'+',Index:Year,[]:'XX',[]:'XX'))]),
  326                           app(P,X)))).
  327
  328semlex(Cat,Sym,Index,Att1-[sem:'REL'|Att2],Sem):-    %%% NOUN-{NAME|NOUN} COMPOUNDS
  329   att(Att1,pos,Pos),
  330   member(Pos,['NN','NNS']),
  331   cat(Cat,n|n), !,
  332   ( att(Att1,relation,Rel), \+ Rel=unknown, !, Att2=Att1; Rel = of, Att2=[relation:of|Att1] ),
  333   ( Rel = '=', !, RelCond = eq(X,Y); RelCond = rel(X,Y,Rel,0) ),
  334   att(Att1,sense,Sense),
  335   Sem = lam(P,lam(X,merge(B:drs([B:[]:Y],
  336                                 [B:Index:pred(Y,Sym,n,Sense),
  337                                  B:[]:RelCond]),
  338                           app(P,X)))).
  339
  340semlex(Cat,Sym,Index,Att1-[sem:'GPE'|Att2],Sem):-   %%% GPE-ADJECTIVES (e.g. French, German, etc.)
  341   cat(Cat,n|n),
  342   att(Att1,pos,'JJ'),
  343   att(Att1,namex,'gpe-nam'), !,
  344   rel(of,Att1-Att2,Relation),
  345   Sem = lam(P,lam(X,merge(B:drs([B:[]:Y],
  346                                 [B:Index:named(Y,Sym,gpe,nam),
  347                                  B:[]:rel(X,Y,Relation,1)]),
  348                           app(P,X)))).
  349
  350/* NEEDS TO BE CHECKED; THERE ARE MANY JJ,Location tagged words
  351
  352semlex(n/n,Sym,Index,Att1-[sem:'UNK'|Att2],Sem):-   %%% LOC-ADJECTIVES (e.g. Antarctic, etc.)
  353   att(Att1,pos,'JJ'),
  354   att(Att1,namex,Ne), neClassType(Ne,loc,Type), !,
  355   rel(in,Att1-Att2,Relation),
  356   Sem = lam(P,lam(X,merge(B:drs([B:[]:Y],
  357                                 [B:Index:named(Y,Sym,loc,Type),
  358                                  B:[]:rel(X,Y,Relation,1)]),
  359                           app(P,X)))).
  360*/
  361
  362semlex(Cat,Sym,Index,Att1-[sem:Tag|Att2],Sem):-    %%% NAME-{NOUN|NAME} COMPOUNDS
  363   cat(Cat,n|n),
  364   att(Att1,pos,Pos),
  365   member(Pos,['NNP','NNPS']), !,
  366   att(Att1,namex,Ner), neClassType(Ner,Class,Type,Tag), 
  367   ( att(Att1,relation,Rel), \+ Rel=unknown, !, Att2=Att1; Rel = '=', Att2=[relation:Rel|Att1] ),
  368   ( Rel = '=', !, RelCond = eq(X,Y); RelCond = rel(X,Y,Rel,0) ),
  369   Sem = lam(P,lam(X,merge(B:drs([B:[]:Y],
  370                                 [B:Index:named(Y,Sym,Class,Type),
  371                                  B:[]:RelCond]),
  372                           app(P,X)))).
  373
  374semlex(Cat,Sym,Index,Att-[sem:Tag|Att],Sem):-
  375   att(Att,pos,Pos),
  376   member(Pos,['NNP','NNPS']),
  377   cat(Cat,n|n), !,
  378   att(Att,namex,Ner), neClassType(Ner,Class,Type,Tag), 
  379   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:named(X,Sym,Class,Type)]),
  380                           app(P,X)))).
  381
  382
  383/* -------------------------------------------------------------------------
  384   Cardinal Adjectives
  385------------------------------------------------------------------------- */
  386
  387semlex(Cat,Sym,Index,Att-[sem:'QUA'|Att],Sem):-
  388   cat(Cat,n|n),
  389   string2digit(Sym,Digit), !,
  390   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:card(X,Digit,eq)]),app(P,X)))).
  391
  392semlex(Cat,Sym,Index,Att-[sem:'QUA'|Att],Sem):-
  393   cat(Cat,n|n),
  394   string2digit(Sym,Digit), !,
  395   Sem = lam(P,lam(X,merge(app(P,X),B:drs([],[B:Index:card(X,Digit,eq)])))).
  396
  397
  398/* -------------------------------------------------------------------------
  399   Composite Adjectives:  10-hour story
  400
  401semlex(Cat,Sym,Index,Att1-Att2,Sem):-
  402   cat(Cat,n|n),
  403   atomic_list_concat([Prefix,Suffix],'-',Sym),
  404   member(Suffix,[acre,year,yard,foot,pound,day,minute,page,point,man,inch,
  405                  degree,week,member,mile,week,km,dollar,kilometer,
  406                  'square-foot',seat,meter,story,hour,time,ton,month]),
  407   string2digit(Prefix,Number), !, 
  408   att(Att1,sense,Sense),
  409   rel(Suffix,Att1-Att2,Relation),
  410   Sem = lam(P,lam(X,merge(B:drs([B:[]:Y],
  411                                 [B:[]:card(Y,Number,eq),
  412                                  B:Index:pred(Y,Suffix,n,Sense),
  413                                  B:[]:rel(X,Y,Relation,0)]),app(P,X)))).
  414------------------------------------------------------------------------- */
  415
  416
  417/* -------------------------------------------------------------------------
  418   Comparative and Superlative Adjectives
  419------------------------------------------------------------------------- */
  420
  421semlex(Cat,Sym,Index,Att-[sem:'MOR'|Att],Sem):-
  422   att(Att,pos,'JJR'), \+ Sym=more,
  423   option('--semantics',amr),
  424   cat(Cat,n|n), !,
  425   att(Att,sense,Sense),
  426   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],[B:[]:rel(X,E,mod,1),B:Index:pred(E,Sym,a,Sense),B:[]:pred(E,more,r,1)]),app(P,X)))).
  427
  428semlex(Cat,Sym,Index,Att1-[sem:'MOR'|Att2],Sem):-
  429   att(Att1,pos,'JJR'), \+ Sym=more,
  430   cat(Cat,n|n), !,
  431   att(Att1,sense,Sense),
  432   roles(Sym,s:adj\np,[Role],Att1-Att2), 
  433   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],[B:[]:role(X,E,Role,-1),B:Index:pred(E,Sym,a,Sense),B:[]:pred(E,more,r,1)]),app(P,X)))).
  434
  435semlex(Cat,Sym,Index,Att-[sem:'TOP'|Att],Sem):-
  436   att(Att,pos,'JJS'), \+ Sym=most,
  437   option('--semantics',amr),
  438   cat(Cat,n|n), !,
  439   att(Att,sense,Sense),
  440   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],[B:[]:rel(X,E,mod,1),B:Index:pred(E,Sym,a,Sense),B:[]:pred(E,most,r,1)]),app(P,X)))).
  441
  442semlex(Cat,Sym,Index,Att1-[sem:'TOP'|Att2],Sem):-
  443   att(Att1,pos,'JJS'), \+ Sym=most,
  444   cat(Cat,n|n), !,
  445   att(Att1,sense,Sense),
  446   roles(Sym,s:adj\np,[Role],Att1-Att2), 
  447   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],[B:[]:role(X,E,Role,-1),B:Index:pred(E,Sym,a,Sense),B:[]:pred(E,most,r,1)]),app(P,X)))).
  448
  449%semlex(Cat,Sym,Index,Att-[sem:'UNK'|Att],Sem):-
  450%   \+ option('--semantics',drg),
  451%   \+ option('--semantics',amr),
  452%   att(Att,pos,'JJS'),
  453%   cat(Cat,n|n), !,
  454%   Sem = lam(P,lam(X,merge(app(P,X),
  455%                           B1:drs([],[B1:[]:imp(merge(B2:drs([B2:[]:Y],[B2:[]:not(B3:drs([],[B3:[]:eq(X,Y)]))]),
  456%                                                      app(P,Y)),
  457%                                                B4:drs([],[B4:Index:rel(X,Y,Sym,0)]))])))).
  458
  459
  460/* -------------------------------------------------------------------------
  461   Singular Intersective Adjectives: AMR
  462------------------------------------------------------------------------- */
  463
  464semlex(Cat,Sym,Index,Att-[sem:'IST'|Att],Sem):-
  465   cat(Cat,n|n), 
  466   option('--semantics',amr), !,
  467   att(Att,sense,Sense),
  468   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],[B:[]:rel(X,E,mod,1),B:Index:pred(E,Sym,a,Sense)]),app(P,X)))).
  469
  470
  471/* -------------------------------------------------------------------------
  472   Singular Intersective Adjectives: Thematic Role Analysis
  473------------------------------------------------------------------------- */
  474
  475semlex(Cat,Sym,Index,Att1-[sem:'IST'|Att2],Sem):-
  476   cat(Cat,n|n), !,
  477   att(Att1,sense,Sense),
  478   roles(Sym,s:adj\np,[Role],Att1-Att2), !,
  479   Sem = lam(P,lam(X,merge(B:drs([B:[]:E],[B:[]:role(X,E,Role,-1),B:Index:pred(E,Sym,a,Sense)]),app(P,X)))).
  480
  481semlex(Cat,Sym,Index,Att1-[sem:'IST'|Att2],Sem):-
  482   cat(Cat,(n|pp)|(n|pp)), !,
  483   att(Att1,sense,Sense),
  484   roles(Sym,s:adj\np,[Role],Att1-Att2), !,
  485   Sem = lam(PP,lam(P,lam(X,merge(B:drs([B:[]:E],[B:[]:role(X,E,Role,-1),B:Index:pred(E,Sym,a,Sense)]),app(app(PP,P),X))))).
  486
  487
  488/* -------------------------------------------------------------------------
  489   Singular Intersective Adjectives: Classic Analysis
  490------------------------------------------------------------------------- */
  491
  492semlex(Cat,Sym,Index,Att-[sem:'IST'|Att],Sem):-
  493   cat(Cat,n|n), !,
  494   att(Att,sense,Sense),
  495   Sem = lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,a,Sense)]),app(P,X)))).
  496
  497semlex(Cat,Sym,Index,Att-[sem:'IST'|Att],Sem):-
  498   cat(Cat,(n|pp)|(n|pp)), !,
  499   att(Att,sense,Sense),
  500   Sem = lam(PP,lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,a,Sense)]),app(app(PP,P),X))))).
  501
  502
  503/* -------------------------------------------------------------------------
  504   Comparatives
  505------------------------------------------------------------------------- */
  506
  507% more than 10 dogs
  508%
  509semlex(Cat,Sym,Index,Att-[sem:'MOR'|Att],Sem):-  
  510   Cat = ((n/n)/(n/n))\(s:adj\np), !,
  511   att(Att,sense,Sense),
  512   Sem = lam(M,lam(C,lam(P,lam(X,merge(app(P,X),
  513             app(app(M,lam(Q,app(Q,X))),
  514                   lam(E,merge(B1:drs([B1:[]:Z],[]),
  515                         app(app(C,lam(Y,B2:drs([],[B2:Index:rel(E,Y,Sym,Sense)]))),Z))))))))).
  516
  517% more than $ 600 million
  518%
  519semlex(Cat,Sym,Index,Att-[sem:'MOR'|Att],Sem):- 
  520   Cat = (n/n)\(s:adj\np), !,
  521   att(Att,sense,Sense),
  522   Sem = lam(M,lam(P,lam(X,merge(B1:drs([B1:[]:Y],[]),
  523                                 merge(app(P,Y),
  524                                       app(app(M,lam(Q,app(Q,X))),lam(E,B:drs([],[B:Index:rel(E,Y,Sym,Sense)])))))))).
  525%   closing(CC),
  526%   Sem = lam(VP,lam(N,lam(X,app(app(VP,lam(P,merge(app(P,X),app(N,X)))),CC)))).
  527
  528% this category is sometimes assigned to opening brackets
  529%
  530semlex(Cat,_Sym,_Index,Att-[sem:'MOR'|Att],Sem):- 
  531   Cat = (n/n)/(s:adj\np), !,
  532   closing(CC),
  533   Sem = lam(VP,lam(N,lam(X,app(app(VP,lam(P,merge(app(P,X),app(N,X)))),CC)))).
  534
  535/* -------------------------------------------------------------------------
  536   Wrongly classified determiners
  537------------------------------------------------------------------------- */
  538
  539semlex(Cat,_Sym,_Index,Att-[sem:'NIL'|Att],Sem):-  
  540   att(Att,pos,'DT'),
  541   member(Cat,[(n/n)/(n/n),(n\n)/(n\n),(n/n)\(n/n)]), !,
  542   Sem = lam(Z,lam(P,lam(X,app(app(Z,P),X)))).
  543
  544
  545/* -------------------------------------------------------------------------
  546   Compound numerals
  547------------------------------------------------------------------------- */
  548
  549semlex(Cat,Sym,Index,Att-[sem:'QUA'|Att],Sem):-  
  550   member(Cat,[(n/n)/(n/n),
  551               (n\n)/(n\n),
  552               (n/n)\(n/n)]), 
  553   string2digit(Sym,Digit), !,
  554   Sem = lam(Z,lam(P,lam(X,merge(B:drs([],[B:Index:card(X,Digit,eq)]),
  555                                 app(app(Z,P),X))))).
  556
  557
  558/* -------------------------------------------------------------------------
  559   Compound superlative adjectives
  560------------------------------------------------------------------------- */
  561
  562semlex(Cat,Sym,Index,Att1-[sem:'TOP'|Att2],Sem):-        
  563   att(Att1,pos,'JJS'),
  564   member(Cat,[(n/n)/(n/n),        %%%% Example: ... fastest growing segment
  565               (n/n)\(n/n)]), !,   %%%% Example: ... third largest bank 
  566   att(Att1,sense,Sense),
  567   roles(Sym,s:adj\np,[Role],Att1-Att2), !,
  568   Sem = lam(Z,lam(P,lam(X,merge(app(app(Z,P),X),
  569                                 B:drs([B:[]:E],[B:[]:role(X,E,Role,-1),
  570                                                 B:Index:pred(E,Sym,a,Sense),
  571                                                 B:[]:pred(E,most,r,1)]))))).
  572
  573semlex(Cat,Sym,Index,Att-[sem:'TOP'|Att],Sem):-        
  574   \+ option('--semantics',drg),
  575   att(Att,pos,'JJS'),
  576   member(Cat,[(n/n)/(n/n),        %%%% Example: ... fastest growing segment
  577               (n/n)\(n/n)]), !,   %%%% Example: ... third largest bank (incorrect semantics!)
  578   Sem = lam(Z,lam(P,lam(X,merge(app(app(Z,P),X),
  579                                 B1:drs([],[B1:[]:imp(merge(B2:drs([B2:[]:Y],[B2:[]:not(B3:drs([],[B3:[]:eq(X,Y)]))]),
  580                                                              app(app(Z,P),Y)),
  581                                                        B4:drs([],[B4:Index:rel(X,Y,Sym,0)]))]))))).
  582
  583/* -------------------------------------------------------------------------
  584   Comparatives (e.g. "more important details")
  585------------------------------------------------------------------------- */
  586
  587semlex(Cat,more,Index,Att-[sem:'MOR'|Att],Sem):-        
  588   member(Cat,[(n/n)/(n/n),(n/n)\(n/n)]), !, 
  589   Sem = lam(Z,lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,more,r,1)]),
  590                                 app(app(Z,P),X))))).
  591
  592
  593/* -------------------------------------------------------------------------
  594   Intensifiers
  595------------------------------------------------------------------------- */
  596
  597semlex(Cat,Sym,Index,Att-[sem:'INT'|Att],Sem):-  
  598   att(Att,pos,Pos),
  599   member(Pos,['NNP','NNPS']),
  600   member(Cat,[(n/n)/(n/n),
  601               (n\n)/(n\n),
  602               (n/n)\(n/n)]), !,
  603   att(Att,namex,Ne), neClassType(Ne,Class,Type),
  604   Sem = lam(Z,lam(P,lam(X,merge(B:drs([],[B:Index:named(X,Sym,Class,Type)]),
  605                                 app(app(Z,P),X))))).
  606
  607semlex(Cat,Sym,Index,Att-[sem:'INT'|Att],Sem):-  
  608   member(Cat,[(n/n)/(n/n),
  609               (n\n)/(n\n),
  610               (n/n)\(n/n)]), !,
  611   att(Att,sense,Sense),
  612   Sem = lam(Z,lam(P,lam(X,merge(B:drs([],[B:Index:pred(X,Sym,r,Sense)]),
  613                                 app(app(Z,P),X))))).
  614
  615semlex(Cat,Sym,Index,Att-[sem:'INT'|Att],Sem):-  
  616   Cat = ((n/n)/(n/n))/((n/n)/(n/n)), !,
  617   att(Att,sense,Sense),
  618   Sem = lam(M,lam(A,lam(P,lam(X,app(app(app(M,A),lam(Y,merge(B:drs([],[B:Index:pred(Y,Sym,r,Sense)]),app(P,Y)))),X))))).
  619
  620/* -------------------------------------------------------------------------
  621   Definite Prepositions
  622------------------------------------------------------------------------- */
  623
  624% except
  625%
  626semlex(Cat,except,Index,Att-[sem:'NOT'|Att],Sem):- 
  627   Cat = (n\n)/pp, !,
  628   Sem = lam(PP,lam(P,lam(X,merge(app(P,X),B:drs([],[B:Index:not(app(PP,X))]))))).
  629
  630semlex(Cat,Sym,Index,Att-[sem:'IST'|Att],Sem):- 
  631   Cat = (n\n)/pp, !,
  632   att(Att,sense,Sense),
  633   Sem = lam(PP,lam(P,lam(X,merge(app(P,X),merge(B:drs([],[B:Index:pred(X,Sym,r,Sense)]),app(PP,X)))))).
  634
  635% Range constructions (e.g., "10 to 20")
  636%
  637semlex(Cat,to,Index,Att-[sem:'DIS'|Att],Sem):- 
  638   Cat = (n\n)/n, !,
  639   Sem = lam(N,lam(P,lam(X,B:drs([],[B:Index:or(app(P,X),app(N,X))])))).
  640
  641% seven cents a share
  642%
  643semlex(Cat,Sym,Index,Att1-[sem:'AND'|Att2],Sem):- 
  644   member(Sym,[a,an]),
  645   Cat = (n\n)/n, !,
  646   rel(for,Att1-Att2,Relation),
  647   Sem = lam(N,lam(P,lam(X,B1:drs([],[B1:[]:imp(merge(B2:drs([B2:[]:Y],[]),app(N,Y)),
  648                                                merge(B3:drs([],[B3:Index:rel(X,Y,Relation,0)]),app(P,X)))])))).
  649
  650semlex(Cat,Sym,Index,Att-[sem:'PRX'|Att],Sem):- 
  651   option('--semantics',amr),
  652   member(Sym,[this,these]),
  653   Cat = (n\n)/n, !,
  654   Sem = lam(N,lam(P,lam(X,alfa(def,merge(B1:drs([B1:[]:Y],[B1:Index:pred(Y,this,r,2)]),app(N,Y)),
  655                                    merge(B2:drs([],[B2:[]:rel(X,Y,rel,0)]),app(P,X)))))).
  656
  657semlex(Cat,Sym,Index,Att-[sem:'DST'|Att],Sem):- 
  658   option('--semantics',amr),
  659   member(Sym,[that,those]),
  660   Cat = (n\n)/n, !,
  661   Sem = lam(N,lam(P,lam(X,alfa(def,merge(B1:drs([B1:[]:Y],[B1:Index:pred(Y,that,r,2)]),app(N,Y)),
  662                                    merge(B2:drs([],[B2:[]:rel(X,Y,rel,0)]),app(P,X)))))).
  663
  664semlex(Cat,Sym,Index,Att-[sem:'PRX'|Att],Sem):- 
  665   member(Sym,[the,this,these]),
  666   Cat = (n\n)/n, !,
  667   Sem = lam(N,lam(P,lam(X,alfa(def,merge(B1:drs([B1:[]:Y],[]),app(N,Y)),
  668                                    merge(B2:drs([],[B2:Index:rel(X,Y,rel,0)]),app(P,X)))))).
  669
  670semlex(Cat,Sym,Index,Att-[sem:'DST'|Att],Sem):- 
  671   member(Sym,[that,those]),
  672   Cat = (n\n)/n, !,
  673   Sem = lam(N,lam(P,lam(X,alfa(def,merge(B1:drs([B1:[]:Y],[]),app(N,Y)),
  674                                    merge(B2:drs([],[B2:Index:rel(X,Y,rel,0)]),app(P,X)))))).
  675
  676semlex(Cat,Sym,Index,Att-[sem:'INT'|Att],Sem):- 
  677   Cat = (n\n)/n, !,
  678   Sem = lam(N,lam(P,lam(X,merge(merge(B1:drs([B1:[]:Y],[]),app(N,Y)),
  679                                 merge(B2:drs([],[B2:Index:rel(X,Y,Sym,0)]),app(P,X)))))).
  680
  681semlex((n/n)/n,Sym,Index,Att-[sem:'UOM'|Att],Sem):- 
  682   att(Att,pos,'$'), !,
  683   Sem = lam(N,lam(P,lam(X,merge(merge(B1:drs([B1:[]:Y],[B1:Index:pred(Y,Sym,n,1)]),app(N,Y)),
  684                                 merge(B2:drs([],[B2:[]:rel(X,Y,rel,0)]),app(P,X)))))).
  685
  686semlex(Cat,Sym,Index,Att-[sem:'INT'|Att],Sem):- 
  687   Cat = (n/n)/n, !,
  688   att(Att,sense,Sense),
  689   Sem = lam(N,lam(P,lam(X,merge(merge(B1:drs([B1:[]:Y],[B1:Index:pred(Y,Sym,n,Sense)]),app(N,Y)),
  690                                 merge(B2:drs([],[B2:[]:rel(X,Y,rel,0)]),app(P,X)))))).
  691
  692semlex(((n/n)\(n/n))/(n/n),_,Index,Att-[sem:'DIS'|Att],Sem):- !,
  693   Sem = lam(M2,lam(M1,lam(P,lam(X,B:drs([],[B:Index:or(app(app(M1,P),X),
  694                                                        app(app(M2,P),X))]))))).
  695
  696semlex(((n/n)\(n/n))/n,_,Index,Att-[sem:'DIS'|Att],Sem):- !,
  697   Sem = lam(N,lam(M,lam(P,lam(X,B:drs([],[B:Index:or(app(app(M,P),X),
  698                                                      merge(app(N,X),app(P,X)))]))))).
  699
  700semlex(((n/pp)\(n/pp))/n,_,Index,Att-[sem:'INT'|Att],Sem):- !,
  701   Sem = lam(N,lam(RN,lam(PP,lam(X,merge(B:drs([B:[]:Y],[B:Index:rel(X,Y,rel,0)]),
  702                                         merge(app(N,Y),app(app(RN,PP),X))))))).
  703
  704
  705
  706/* -------------------------------------------------------------------------
  707   Prepositions
  708------------------------------------------------------------------------- */
  709
  710semlex(Cat,Sym,Index,Att-[sem:'AND'|Att],Sem):-
  711   member(Cat,[(n\n)/np,
  712               (n/n)/np,
  713               (n/n)\np,
  714               (n\n)\np]), !,
  715   Sem = lam(Q,lam(P,lam(X,merge(app(P,X),app(Q,lam(Y,B:drs([],[B:Index:rel(X,Y,Sym,0)]))))))).
  716
  717semlex(Cat,Sym,Index,Att-[sem:'AND'|Att],Sem):-
  718   Cat = ((n/(s:to\np))\(n/(s:to\np)))/np, !,
  719   Sem = lam(Q,lam(N,lam(VP,lam(X,merge(app(app(N,VP),X),app(Q,lam(Y,B:drs([],[B:Index:rel(X,Y,Sym,0)])))))))).
  720
  721semlex(Cat,Sym,Index,Att-[sem:'AND'|Att],Sem):-
  722   member(Cat,[((n/n)\(n/n))/np,
  723               ((n/pp)\(n/pp))/np]), !,
  724   Sem = lam(Q,lam(Z,lam(P,lam(Y,app(app(Z,lam(X,merge(app(Q,lam(Y,B:drs([],[B:Index:rel(X,Y,Sym,0)]))),
  725                                                       app(P,X)))),Y))))).  
  726
  727
  728/* -------------------------------------------------------------------------
  729   Noun subcategorising for sentence
  730------------------------------------------------------------------------- */
  731
  732semlex(Cat,Sym,Index,Att1-[sem:'SUB'|Att2],Sem):-
  733   member(Cat,[n/s:em,n/s:qem,n/s:bem]), !,
  734   att(Att1,sense,Sense),
  735   roles(Sym,(s:dcl\np)/s:_,[Role,_],Att1-Att2), 
  736   Sem = lam(S,lam(X,merge(B1:drs([],
  737                                  [B1:Index:pred(X,Sym,n,Sense)]),
  738                           app(S,lam(E,B2:drs([],[B2:[]:role(X,E,Role,1)])))))).
  739
  740semlex(Cat,Sym,Index,Att1-[sem:'SUB'|Att2],Sem):-
  741   Cat = n/s:_, !,
  742   att(Att1,sense,Sense),
  743   roles(Sym,(s:dcl\np)/s:_,[Role,_],Att1-Att2),
  744   plosing(CC),
  745   Sem = lam(S,lam(X,B:drs([B:[]:K],
  746                           [B:Index:pred(X,Sym,n,Sense),
  747                            B:[]:role(X,K,Role,1),
  748                            B:[]:prop(K,app(S,CC))]))).
  749
  750semlex(Cat,Sym,Index,Att1-[sem:'SUB'|Att2],Sem):-
  751   Cat = (n/pp)/s:_, !, 
  752   att(Att1,sense,Sense),
  753   plosing(CC),
  754   roles(Sym,(s:dcl\np)/s:_,[Role,_],Att1-Att2),
  755   Sem = lam(S,lam(P,lam(X,merge(B:drs([B:[]:K],
  756                                       [B:Index:pred(X,Sym,n,Sense),
  757                                        B:[]:rel(X,K,Role,0),
  758                                        B:[]:prop(K,app(S,CC))]),app(P,X))))).
  759
  760
  761/* -------------------------------------------------------------------------
  762   NP modifying noun
  763------------------------------------------------------------------------- */
  764
  765semlex(n/np,Sym,Index,Att-[sem:'AND'|Att],Sem):- !,
  766   att(Att,sense,Sense),
  767   Sem = lam(NP,lam(X,merge(B1:drs([],[B1:Index:pred(X,Sym,n,Sense)]),
  768                            app(NP,lam(Y,B2:drs([],[B2:[]:rel(X,Y,rel,0)])))))).
  769
  770
  771/* -------------------------------------------------------------------------
  772   Restrictive Relative Pronous
  773------------------------------------------------------------------------- */
  774
  775semlex(Cat,Sym,_Index,Att1-[sem:'AND'|Att2],Sem):-
  776   member(Cat,[(n\n)/(s:to\np), (n\n)/(s:to/np)]), !,
  777   roles(Sym,(s:dcl\np)/s:_,[Role,_],Att1-Att2), 
  778   Sem = lam(VP,lam(N,lam(X,merge(app(N,X),
  779                                  app(app(VP,
  780                                          lam(P,app(P,X))),
  781                                      lam(Y,B:drs([],[B:[]:role(X,Y,Role,1)]))))))).
  782
  783semlex(Cat,_Sym,_Index,Att-[sem:'AND'|Att],Sem):-
  784   member(Cat,[(n\n)/(s:_\np), (n\n)/(s:_/np)]), !,
  785   closing(CC),
  786   Sem = lam(VP,lam(N,lam(X,merge(app(N,X),
  787                                  app(app(VP,
  788                                          lam(P,app(P,X))),
  789                                      CC))))).
  790
  791semlex(((n\n)/(s:dcl\np))/n,_,Index,Att1-[sem:'AND'|Att2],Sem):- !,
  792   closing(CC),
  793   rel(of,Att1-Att2,Relation),
  794   Sem = lam(N,lam(VP,lam(P,lam(X,merge(app(P,X),app(app(VP,lam(P,merge(B:drs([B:[]:Y],[B:Index:rel(Y,X,Relation,1)]),
  795                                                                        merge(app(N,Y),app(P,Y))))),CC)))))).
  796
  797semlex((n\n)/s:_, Sym,Index,Att-[sem:'SUB'|Att],Sem):- !,
  798   plosing(CC),
  799   Sem = lam(S,lam(P,lam(X,merge(B:drs([B:[]:Z],[B:Index:rel(X,Z,Sym,0),
  800                                               B:[]:prop(Z,app(S,CC))]),
  801                                 app(P,X)))))