2:- module(drs2amr,[drs2amr/4,printAMR/2]).    3
    4:- use_module(library(lists),[select/3,member/2,append/3]).    5:- use_module(semlib(errors),[warning/2]).    6:- use_module(semlib(options),[option/2]).    7:- use_module(semlib(drs2tacitus),[label/4]).    8:- use_module(knowledge(amrmfs),[mfs/2]).    9:- use_module(knowledge('verbalization-list-v1.01'),[verbalize/2,verbalize/3,verbalize/4,verbalize/6]).   10:- use_module(knowledge(role91),[role91/3]).   11:- use_module(knowledge(negprefix),[negprefix/4]).   12:- use_module(knowledge(negsuffix),[negsuffix/4]).   13:- use_module(knowledge(nationality),[nationality/5]).   14:- use_module(knowledge(wiki),[wiki/3]).   15
   16/* ========================================================================
   17   Main Predicate
   18======================================================================== */
   19
   20drs2amr(DRS,Tags,N,AMR5):- 
   21   drs2amr(DRS,Tags,[],AMR1,N-_,_Root),
   22   pp(AMR1,AMR2),
   23   fixRoots(AMR2,AMR3), 
   24   replace(AMR3,AMR4),
   25   addins(AMR4,AMR5), !.
   26
   27drs2amr(_,_,_,[[]:ins(x,and)]):-
   28   warning('unable to build AMR',[]).
   29
   30
   31/* ========================================================================
   32   Compute all reachable nodes (from an arbitrary starting point)
   33======================================================================== */
   34
   35reachable(X,_,R,R):- member(X,R), !.
   36reachable(X,AMR,R1,R2):-
   37   findall(Y,(member(_:arg(_,X,Y),AMR);member(_:arg(_,Y,X),AMR)),L),
   38   reachableL(L,AMR,[X|R1],R2).
   39
   40reachableL([],_,R,R).
   41reachableL([X|L],AMR,R1,R3):- 
   42   reachable(X,AMR,R1,R2),
   43   reachableL(L,AMR,R2,R3).
   44
   45
   46/* ========================================================================
   47   Count Vertices
   48======================================================================== */
   49
   50countVertices([],C,N):-
   51   length(C,N).
   52
   53countVertices([_:arg(_,X,Y)|L],C1,N):-
   54   addV(X,C1,C2), addV(Y,C2,C3),
   55   countVertices(L,C3,N).
   56
   57countVertices([_:ins(X,_)|L],C1,N):-
   58   addV(X,C1,C2),
   59   countVertices(L,C2,N).
   60
   61
   62/* ========================================================================
   63   Add vertice to list if not seen before
   64======================================================================== */
   65
   66addV(X,L,L):- member(X,L), !.
   67addV(X,L,[X|L]).
   68
   69
   70/* ========================================================================
   71   Fix Roots 
   72======================================================================== */
   73
   74fixRoots(AMR1,AMR2):-
   75   getRoots(AMR1,Roots),
   76%  write(roots:Roots),nl,
   77   select(Root,Roots,FixRoots),
   78   inverseRoles(FixRoots,AMR1,AMR2), 
   79   checkInstance(Root,AMR2,[]), !.
   80
   81fixRoots(AMR1,AMR2):-
   82   getRoots(AMR1,[R1,R2]), !, I=[],
   83   AMR2=[I:ins(root,'multi-sentence'),I:arg(snt1,root,R1),I:arg(snt2,root,R2)|AMR1],
   84   warning('cannot inverse roles for AMR with roots ~p and ~p, added artificial root',[R1,R2]).
   85
   86fixRoots(AMR1,AMR2):-
   87   getRoots(AMR1,[R1,R2,R3]), !, I=[],
   88   AMR2=[I:ins(root,'multi-sentence'),I:arg(snt1,root,R1),I:arg(snt2,root,R2),I:arg(snt3,root,R3)|AMR1],
   89   warning('cannot inverse roles for AMR with roots ~p, ~p, and ~p, added artificial root',[R1,R2,R3]).
   90
   91fixRoots(AMR1,AMR2):-
   92   getRoots(AMR1,[R1,R2,R3,R4]), !, I=[],
   93   AMR2=[I:ins(root,'multi-sentence'),I:arg(snt1,root,R1),I:arg(snt2,root,R2),I:arg(snt3,root,R3),I:arg(snt4,root,R4)|AMR1],
   94   warning('cannot inverse roles for AMR with roots ~p, ~p, ~p, and ~p, added artificial root',[R1,R2,R3,R4]).
   95
   96fixRoots(AMR1,AMR2):-
   97   getRoots(AMR1,[]), 
   98   member(_:ins(X,_),AMR1),
   99   AMR2=[[]:ins(root,and),[]:arg(op1,root,X)|AMR1],
  100   checkInstance(root,AMR2,[]), !,
  101   warning('cyclic AMR, added new root to ~p',[X]).
  102
  103fixRoots(AMR,AMR):-
  104   getRoots(AMR,Roots), !,
  105   warning('cannot inverse roles for AMR with roots ~p',[Roots]).
  106
  107
  108/* ========================================================================
  109   Ensure that an AMR has exactly one root. Do this by inversing roles.
  110======================================================================== */
  111
  112inverseRoles([],AMR,AMR).
  113
  114inverseRoles([Root|Roots],AMR1,AMR3):-
  115   inverseR(ARG,INV),
  116   select(I:arg(ARG,Root,X),AMR1,AMR2),
  117   inverseRoles(Roots,[I:arg(INV,X,Root)|AMR2],AMR3).
  118
  119inverseRoles([Root|Roots],AMR1,AMR4):-
  120   inverseR(ARG1,INV1),
  121   select(I1:arg(ARG1,Root,X),AMR1,AMR2),
  122   inverseR(ARG2,INV2),
  123   select(I2:arg(ARG2,X,Y),AMR2,AMR3),
  124   inverseRoles(Roots,[I1:arg(INV1,X,Root),I2:arg(INV2,Y,X)|AMR3],AMR4).
  125
  126
  127/* ========================================================================
  128   Roles that can be inverted
  129======================================================================== */
  130
  131inverseR('ARG0','ARG0-of').
  132inverseR('ARG1','ARG1-of').
  133inverseR('ARG2','ARG2-of').
  134inverseR('op1', 'op1-of').
  135inverseR('op2', 'op2-of').
  136inverseR('quant', 'quant-of').
  137inverseR('domain', 'domain-of').
  138inverseR('mod', 'mod-of').
  139inverseR('in', 'in-of').
  140
  141
  142/* ========================================================================
  143   replace(+AMR,-AMR)
  144   Replacing equality statements (introduced by prop/2 or lab/2 conditions)
  145======================================================================== */
  146
  147replace(AMR1,AMR4):-
  148   select(replace(Old,New),AMR1,AMR2), !,
  149   replace(AMR2,Old,New,AMR3),
  150   replace(AMR3,AMR4).
  151
  152replace(A,A).
  153
  154
  155/* ========================================================================
  156   addins(+AMR,-AMR)
  157   Adding ins/2 if not there
  158======================================================================== */
  159
  160addins(AMR1,AMR2):- 
  161   member(_:arg(_,X,_),AMR1), 
  162   \+ member(_:ins(X,_),AMR1), !,
  163%  warning('added ins/2 thing to AMR for ~p on position ~p',[X,I]),
  164   addins([[]:ins(X,thing)|AMR1],AMR2).
  165
  166addins(AMR1,AMR2):- 
  167   member(I:arg(_,_,X),AMR1),
  168   variable(X),
  169   \+ member(_:ins(X,_),AMR1), !,
  170   warning('added ins/2 thing to AMR for ~p on position ~p',[X,I]),
  171   addins([[]:ins(X,thing)|AMR1],AMR2).
  172
  173addins(A,A).
  174
  175
  176/* ========================================================================
  177   Checking for a variable
  178======================================================================== */
  179
  180variable(X):- 
  181   \+ member(X,[imperative]), 
  182   atom(X), name(X,[C|_]),
  183   C > 96,  C < 123.
  184
  185
  186/* ========================================================================
  187   Replacing equality statements
  188======================================================================== */
  189
  190replace(Atom,_,_,Atom):- atomic(Atom), !.
  191replace([],_,_,[]):- !.
  192replace([Var|L1],Old,New,[Var|L2]):- var(Var), !, replace(L1,Old,New,L2).
  193replace([Old|L1],Old,New,[New|L2]):- !, replace(L1,Old,New,L2).
  194replace([Term1|L1],Old,New,[Term2|L2]):- 
  195   Term1 =.. [F|Args1], !, replace(Args1,Old,New,Args2),
  196   Term2 =.. [F|Args2],    replace(L1,Old,New,L2).
  197
  198
  199/* ========================================================================
  200   Post-processing
  201======================================================================== */
  202
  203pp(AMR1,AMR4):-
  204%  printAMR(AMR1,user_output),nl,
  205   rule(Selects,Members,Adds,Conds),
  206   selectall(Selects,AMR1,AMR2),
  207   memberall(Members,AMR2), condsall(Conds), !,
  208   addall(Adds,AMR2,AMR3),
  209   pp(AMR3,AMR4).
  210   
  211pp(AMR,AMR).
  212
  213
  214/* ========================================================================
  215   Auxiliary predicates used by post-processing
  216======================================================================== */
  217
  218selectall([],A,A).
  219selectall([X|L],A1,A3):- select(X,A1,A2), selectall(L,A2,A3).
  220
  221memberall([],_).
  222memberall([not(X)|L],A):- \+ member(X,A), memberall(L,A).
  223memberall([X|L],A):- member(X,A), memberall(L,A).
  224
  225condsall([]).
  226condsall([X|L]):- call(X), condsall(L).
  227
  228addall([],A,A).
  229addall([X|L],A1,[X|A2]):- addall(L,A1,A2).
  230
  231
  232/* ========================================================================
  233   Rewriting Rules for AMRs
  234   rule(+Delete,+Check,+Add,+Conditions)
  235======================================================================== */
  236
  237% more/less than X N
  238rule([J:ins(S,more),_:arg(than,S,X),_:arg('ARG1-of',Y,S),I:arg(quant,X,Q)],[],[I:arg(quant,Y,S),J:ins(S,'more-than'),[]:arg('op1',S,Q)],[]).
  239rule([J:ins(S,less),_:arg(than,S,X),_:arg('ARG1-of',Y,S),I:arg(quant,X,Q)],[],[I:arg(quant,Y,S),J:ins(S,'less-than'),[]:arg('op1',S,Q)],[]).
  240
  241% fix adverbs
  242rule([I:arg(manner,E,A)],[_:ins(A,also)],[I:arg(mod,E,A)],[]).     
  243rule([I:arg(manner,E,A),J:ins(A,ful)],[],[I:arg(degree,E,A),J:ins(A,full)],[]).     
  244
  245% fix double prepositions
  246%rule([[I]:arg(Prep,X,Y),_:ins(Y,thing),[J]:arg(Prep2,Y,Z)],[],[[I]:arg(Prep,X,Z)],[J is I + 1, warning('removed double preposition ~p',[Prep2])]).     
  247rule([_:ins(X,such),I:arg(as,X,Y)],[_:ins(X,_)],[I:arg(example,X,Y)],[]).
  248
  249% next/last year
  250rule([[I]:ins(X,next)],[_:arg(time,X,Y),_:ins(X,_)],[I:ins(New,next),[]:arg(mod,Y,New)],[name(I,L),name(New,[117|L])]).
  251rule([[I]:ins(X,last)],[_:arg(time,X,Y),_:ins(X,_)],[I:ins(New,last),[]:arg(mod,Y,New)],[name(I,L),name(New,[117|L])]).
  252rule([_:arg(manner,E,X)],[[I]:ins(X,last),[J]:ins(Y,_),_:arg(time,E,Y)],[[]:arg(mod,Y,X)],[J is I + 1]).
  253rule([_:arg(manner,E,X)],[[I]:ins(X,next),[J]:ins(Y,_),_:arg(time,E,Y)],[[]:arg(mod,Y,X)],[J is I + 1]).
  254
  255% fix intensifiers
  256rule([I:arg(manner,E,V)],[_:ins(V,very),_:arg(manner,E,M)],[I:arg(degree,M,V)],[]).     
  257rule([I:arg(manner,E,V)],[_:ins(V,too), _:arg(manner,E,M)],[I:arg(degree,M,V)],[]).     
  258rule([I:arg(manner,E,V)],[_:ins(V,so), _:arg(manner,E,M)],[I:arg(degree,M,V)],[]).     
  259rule([I:arg(manner,E,V)],[_:ins(V,very)],[I:arg(degree,E,V)],[]).     
  260rule([I:arg(manner,E,V)],[_:ins(V,less)],[I:arg(degree,E,V)],[]).     
  261rule([I:arg(manner,E,V)],[_:ins(V,more)],[I:arg(degree,E,V)],[]).     
  262rule([I:arg(manner,E,V)],[_:ins(V,most)],[I:arg(degree,E,V)],[]).     
  263rule([I:arg(mod,E,V)],[_:ins(V,more)],[I:arg(degree,E,V)],[]).     
  264rule([I:arg(mod,E,V)],[_:ins(V,so)],[I:arg(degree,E,V)],[]).     
  265rule([I:arg(ord,E,S)],[_:arg(degree,X,M),_:ins(M,most),_:arg(domain,X,E)],[I:arg(ord,M,S)],[]).
  266rule([I:arg(manner,X,S)],[_:ins(S,so),_:arg(quant,X,M),_:ins(M,much)],[I:arg(degree,M,S)],[]).     
  267rule([I:arg(mod,X,S)],[_:ins(S,great),_:arg(quant,X,M),_:ins(M,many)],[I:arg(mod,M,S)],[]).     
  268
  269% fix adjectives
  270rule([I:arg(mod,E,V)],[_:ins(V,overseas)],[I:arg(location,E,V)],[]).     
  271rule([I:arg(mod,E,V)],[_:ins(V,rural)],[I:arg(location,E,V)],[]).     
  272rule([I:arg(manner,E,V)],[_:ins(V,overseas)],[I:arg(location,E,V)],[]).     
  273
  274% fix ordinals
  275rule([I:arg(mod,E,O),J:ins(O,first)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,1)],[]).
  276rule([I:arg(mod,E,O),J:ins(O,second)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,2)],[]).
  277rule([I:arg(mod,E,O),J:ins(O,third)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,3)],[]).
  278rule([I:arg(mod,E,O),J:ins(O,fourth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,4)],[]).
  279rule([I:arg(mod,E,O),J:ins(O,fifth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,5)],[]).
  280rule([I:arg(mod,E,O),J:ins(O,fifth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,5)],[]).
  281rule([I:arg(mod,E,O),J:ins(O,sixth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,6)],[]).
  282rule([I:arg(mod,E,O),J:ins(O,seventh)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,7)],[]).
  283rule([I:arg(mod,E,O),J:ins(O,eighth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,8)],[]).
  284rule([I:arg(mod,E,O),J:ins(O,ninth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,9)],[]).
  285rule([I:arg(mod,E,O),J:ins(O,tenth)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,10)],[]).
  286rule([I:arg(mod,E,O),J:ins(O,X)],[],[I:arg(ord,E,O),J:ins(O,'ordinal-entity'),[]:arg(value,O,Num)],
  287     [name(X,Codes), member(Suffix,["st","nd","rd","th"]), append(Int,Suffix,Codes), name(Num,Int), number(Num)]).
  288
  289% adverbs
  290rule([_:arg(manner,E,V),I:ins(V,please)],[],[I:arg(polite,E,'+')],[]).     
  291rule([I:arg(manner,E,A)],[_:ins(A,always)],[I:arg(time,E,A)],[]).     
  292rule([I:arg(manner,E,A)],[_:ins(A,now)],[I:arg(time,E,A)],[]).     
  293rule([I:arg(manner,E,A)],[_:ins(A,once)],[I:arg(time,E,A)],[]).     
  294rule([I:arg(manner,E,A)],[_:ins(A,after)],[I:arg(time,E,A)],[]).     
  295rule([I:arg(manner,E,A)],[_:ins(A,before)],[I:arg(time,E,A)],[]).     
  296rule([I:arg(manner,E,A)],[_:ins(A,since)],[I:arg(time,E,A)],[]).     
  297rule([I:arg(manner,E,A)],[_:ins(A,soon)],[I:arg(time,E,A)],[]).     
  298rule([I:arg(manner,E,A)],[_:ins(A,then)],[I:arg(time,E,A)],[]).     
  299rule([I:arg(manner,E,A)],[_:ins(A,today)],[I:arg(time,E,A)],[]).     
  300rule([I:arg(manner,E,A)],[_:ins(A,ever)],[I:arg(time,E,A)],[]).    
  301rule([I:arg(manner,E,A)],[_:ins(A,day)],[I:arg(time,E,A)],[]).     
  302rule([I:arg(manner,E,A)],[_:ins(A,already)],[I:arg(time,E,A)],[]).     
  303rule([I:arg(manner,E,A)],[_:ins(A,recent)],[I:arg(time,E,A)],[]).     
  304rule([I:arg(manner,E,A)],[_:ins(A,sometimes)],[I:arg(frequency,E,A)],[]).     
  305rule([I:arg(at,E,A)],[_:ins(A,present)],[I:arg(time,E,A)],[]).     
  306
  307% morpohlogy of adjectives and nouns
  308rule([I:ins(X,agricultural)],[],[I:ins(X,agriculture)],[]).
  309rule([I:ins(X,coastal)],[],[I:ins(X,coast)],[]).
  310rule([I:ins(X,commercial)],[],[I:ins(X,commerce)],[]).
  311rule([I:ins(X,cultural)],[],[I:ins(X,culture)],[]).
  312rule([I:ins(X,drastical)],[],[I:ins(X,drastic)],[]).
  313rule([I:ins(X,domestical)],[],[I:ins(X,domestic)],[]).
  314rule([I:ins(X,economic)],[],[I:ins(X,economy)],[]).
  315rule([I:ins(X,economical)],[],[I:ins(X,economy)],[]).
  316rule([I:ins(X,electronical)],[],[I:ins(X,electronics)],[]).
  317rule([I:ins(X,electrical)],[],[I:ins(X,electricity)],[]).
  318rule([I:ins(X,electromechanical)],[],[I:ins(X,electromechanics)],[]).
  319rule([I:ins(X,emphatical)],[],[I:ins(X,emphasis)],[]).
  320rule([I:ins(X,environmental)],[],[I:ins(X,environment)],[]).
  321rule([I:ins(X,experimental)],[],[I:ins(X,'experiment-01')],[]).
  322rule([I:ins(X,financial)],[],[I:ins(X,finance)],[]).
  323rule([I:ins(X,'non-financial')],[],[I:ins(X,finance),[]:arg(polarity,X,'-')],[]).
  324rule([I:ins(X,governmental)],[],[I:ins(X,government)],[]).
  325rule([I:ins(X,historical)],[],[I:ins(X,history)],[]).
  326rule([I:ins(X,industrial)],[],[I:ins(X,industry)],[]).
  327rule([I:ins(X,mechanical)],[],[I:ins(X,mechanics)],[]).
  328rule([I:ins(X,medical)],[],[I:ins(X,medicine)],[]).
  329rule([I:ins(X,meeting)],[],[I:ins(X,'meeting-03')],[]).
  330rule([I:ins(X,metallurgical)],[],[I:ins(X,metallurgy)],[]).
  331rule([I:ins(X,national)],[],[I:ins(X,nation)],[]).
  332rule([I:ins(X,natural)],[],[I:ins(X,'natural-03')],[]).
  333rule([I:ins(X,orbital)],[],[I:ins(X,'orbit-01')],[]).
  334rule([I:ins(X,pharmaceutical)],[],[I:ins(X,pharmacy)],[]).
  335rule([I:ins(X,political)],[],[I:ins(X,politics)],[]).
  336rule([I:ins(X,provincial)],[],[I:ins(X,province)],[]).
  337rule([I:ins(X,regional)],[],[I:ins(X,region)],[]).
  338rule([I:ins(X,racial)],[],[I:ins(X,race)],[]).
  339rule([I:ins(X,scientifical)],[],[I:ins(X,science)],[]).
  340rule([I:ins(X,social)],[],[I:ins(X,society)],[]).
  341rule([I:ins(X,statistics)],[],[I:ins(X,statistic)],[]).
  342rule([I:ins(X,statistical)],[],[I:ins(X,statistic)],[]).
  343rule([I:ins(X,specifical)],[],[I:ins(X,'specific-02')],[]).
  344rule([I:ins(X,technical)],[],[I:ins(X,technology)],[]).
  345rule([I:ins(X,technological)],[],[I:ins(X,technology)],[]).
  346rule([I:ins(X,theoretical)],[],[I:ins(X,theory)],[]).
  347rule([I:ins(X,territorial)],[],[I:ins(X,territory)],[]).
  348rule([I:ins(X,theatrical)],[],[I:ins(X,theater)],[]).
  349rule([I:ins(X,traditional)],[],[I:ins(X,tradition)],[]).
  350
  351
  352% time
  353rule([[I]:arg(after,X,Y)],[],[I:ins(A,after),[]:arg(time,X,A),[]:arg(op1,A,Y)],[name(I,Codes),append("a",Codes,NewCodes),name(A,NewCodes)]).
  354rule([[I]:arg(since,X,Y)],[],[I:ins(A,since),[]:arg(time,X,A),[]:arg(op1,A,Y)],[name(I,Codes),append("s",Codes,NewCodes),name(A,NewCodes)]).
  355
  356% without
  357rule([I:arg(without,E,X)],[],[I:arg(manner,E,X),[]:arg(polarity,X,'-')],[]).
  358
  359% fixing roles
  360rule([I:ins(E,'accord-00'),J:arg(to,E,P)],[],[I:ins(E,'say-01'),J:arg('ARG0',E,P)],[]).
  361rule([I:arg(manner,E,N),J:ins(N,never)],[],[I:arg(time,E,N),J:ins(N,ever),[]:arg(polarity,E,'-')],[]).     
  362rule([I:arg(like,E,N),J:ins(E,'be-00')],[],[I:arg('ARG1',E,N),J:ins(E,'resemble-01')],[]).     
  363rule([I:arg(in,E,L)],[_:ins(L,'location')],[I:arg(location,E,L)],[]).     
  364rule([I:arg(rel,E,L)],[_:ins(L,'location')],[I:arg(location,E,L)],[]).     
  365rule([I:arg(manner,E,L)],[_:ins(L,'here')],[I:arg(location,E,L)],[]).     
  366rule([I:arg(rel,E,L)],[_:ins(L,'date-entity')],[I:arg(time,E,L)],[]).     
  367rule([I:arg(on,E,L)],[_:ins(L,'date-entity')],[I:arg(time,E,L)],[]).     
  368rule([I:arg(in,E,L)],[_:ins(L,'date-entity')],[I:arg(time,E,L)],[]).     
  369rule([_:arg(time,D,X),_:ins(X,'date-entity'),I:arg(R,X,Y)],[_:ins(D,'date-entity')],[I:arg(R,D,Y)],[]).
  370rule([_:arg(poss,D,X),_:ins(X,'date-entity'),I:arg(year,X,Y)],[_:ins(D,'date-entity')],[I:arg(year,D,Y)],[]).
  371
  372% date intervals
  373rule([[I]:arg(from,F,X),_:arg(to,F,Y)],[_:ins(X,'date-entity'),_:ins(Y,'date-entity')],[I:arg(time,F,D),[]:ins(D,'date-interval'),[]:arg('op1',D,X),[]:arg('op2',D,Y)],[name(I,Codes),name(D,[110|Codes])]).
  374
  375% imperative
  376rule([I:arg(manner,E,V),_:ins(V,imperative)],[],[I:arg(mode,E,imperative)],[]).     
  377
  378% sentence-initial "and" and "but"
  379rule([I:arg(manner,E,A)],[[1001]:ins(A,and)],[I:arg('op2-of',E,A)],[]).                        
  380rule([I:arg(manner,E,A),[1001]:ins(A,but)],[],[[1001]:ins(A,'contrast-01'),I:arg('ARG2-of',E,A)],[]).                        
  381
  382% nested "and": tricky...
  383%rule([I:arg(op2,X,Y)],[_:ins(X,and),_:ins(Y,and)],[I:arg(nestedand,X,Y)],[]).
  384
  385rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4),I5:arg(op5,Y,O5),I6:arg(op6,Y,O6),I7:arg(op7,Y,O7)],[],
  386                                       [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4),I5:arg(op6,X,O5),I6:arg(op7,X,O6),I7:arg(op8,X,O7)],[]).
  387
  388rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4),I5:arg(op5,Y,O5),I6:arg(op6,Y,O6)],[],
  389                                       [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4),I5:arg(op6,X,O5),I6:arg(op7,X,O6)],[]).
  390
  391rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4),I5:arg(op5,Y,O5)],[],
  392                                       [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4),I5:arg(op6,X,O5)],[]).
  393
  394rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3),I4:arg(op4,Y,O4)],[],
  395                                       [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3),I4:arg(op5,X,O4)],[]).
  396
  397rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2),I3:arg(op3,Y,O3)],[],
  398                                       [I1:arg(op2,X,O1),I2:arg(op3,X,O2),I3:arg(op4,X,O3)],[]).
  399
  400rule([_:arg(nestedand,X,Y),_:ins(Y,and),I1:arg(op1,Y,O1),I2:arg(op2,Y,O2)],[],
  401                                       [I1:arg(op2,X,O1),I2:arg(op3,X,O2)],[]).
  402
  403% X / and
  404%  :op1 ...
  405%  :op2 (Y / and             :op2 (O1 /  )
  406%          :op1 (O1 /  )     :op3 (O2 
  407%          :op2 (O2 /  )
  408
  409% discourse relations
  410rule([I:arg(op1,X,Y)],[_:ins(X,'contrast-01')],[I:arg('ARG1',X,Y)],[]).
  411rule([I:arg(op2,X,Y)],[_:ins(X,'contrast-01')],[I:arg('ARG2',X,Y)],[]).
  412rule([I:arg(op1,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt1',X,Y)],[]).
  413rule([I:arg(op2,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt2',X,Y)],[]).
  414rule([I:arg(op3,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt3',X,Y)],[]).
  415rule([I:arg(op4,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt4',X,Y)],[]).
  416rule([I:arg(op5,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt5',X,Y)],[]).
  417rule([I:arg(op6,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt6',X,Y)],[]).
  418rule([I:arg(op7,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt7',X,Y)],[]).
  419rule([I:arg(op8,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt8',X,Y)],[]).
  420rule([I:arg(op9,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt9',X,Y)],[]).
  421rule([I:arg(op10,X,Y)],[_:ins(X,'multi-sentence')],[I:arg('snt10',X,Y)],[]).
  422rule([I:ins(X,continuation)],[],[I:ins(X,'multi-sentence')],[]).
  423
  424% there-insertion, pleonastic it
  425rule([_:ins(X,there),_:arg(domain,_,X)],[],[],[]).
  426rule([_:ins(X,it),_:arg(domain,E,X)],[_:arg('ARG1',E,_)],[],[]).
  427
  428% put eight names together
  429rule([[I8]:arg(name,X,A8),[I8]:ins(A8,name),[I8]:arg('op1',A8,N8),
  430      [I7]:arg(name,X,A7),[I7]:ins(A7,name),[I7]:arg('op1',A7,N7),
  431      [I6]:arg(name,X,A6),[I6]:ins(A6,name),[I6]:arg('op1',A6,N6),
  432      [I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
  433      [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
  434      [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
  435      [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
  436      [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
  437     [],
  438     [[I1,I2,I3,I4,I5,I6,I7,I8]:arg(name,X,A1), 
  439      [I1,I2,I3,I4,I5,I6,I7,I8]:ins(A1,name),
  440      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op1',A1,N1), 
  441      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op2',A1,N2),
  442      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op3',A1,N3),
  443      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op4',A1,N4),
  444      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op5',A1,N5),
  445      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op6',A1,N6),
  446      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op7',A1,N7),
  447      [I1,I2,I3,I4,I5,I6,I7,I8]:arg('op8',A1,N8)],
  448     [I2 is I1+1,
  449      I3 is I2+1,
  450      I4 is I3+1,
  451      I5 is I4+1,
  452      I6 is I5+1,
  453      I7 is I6+1,
  454      I8 is I7+1,warning('put 8 names together',[])]).
  455
  456% put seven names together
  457rule([[I7]:arg(name,X,A7),[I7]:ins(A7,name),[I7]:arg('op1',A7,N7),
  458      [I6]:arg(name,X,A6),[I6]:ins(A6,name),[I6]:arg('op1',A6,N6),
  459      [I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
  460      [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
  461      [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
  462      [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
  463      [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
  464     [],
  465     [[I1,I2,I3,I4,I5,I6,I7]:arg(name,X,A1), 
  466      [I1,I2,I3,I4,I5,I6,I7]:ins(A1,name),
  467      [I1,I2,I3,I4,I5,I6,I7]:arg('op1',A1,N1), 
  468      [I1,I2,I3,I4,I5,I6,I7]:arg('op2',A1,N2),
  469      [I1,I2,I3,I4,I5,I6,I7]:arg('op3',A1,N3),
  470      [I1,I2,I3,I4,I5,I6,I7]:arg('op4',A1,N4),
  471      [I1,I2,I3,I4,I5,I6,I7]:arg('op5',A1,N5),
  472      [I1,I2,I3,I4,I5,I6,I7]:arg('op6',A1,N6),
  473      [I1,I2,I3,I4,I5,I6,I7]:arg('op7',A1,N7)],
  474     [I2 is I1+1,
  475      I3 is I2+1,
  476      I4 is I3+1,
  477      I5 is I4+1,
  478      I6 is I5+1,
  479      I7 is I6+1]).
  480
  481% put six names together
  482rule([[I6]:arg(name,X,A6),[I6]:ins(A6,name),[I6]:arg('op1',A6,N6),
  483      [I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
  484      [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
  485      [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
  486      [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
  487      [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
  488     [],
  489     [[I1,I2,I3,I4,I5,I6]:arg(name,X,A1), 
  490      [I1,I2,I3,I4,I5,I6]:ins(A1,name),
  491      [I1,I2,I3,I4,I5,I6]:arg('op1',A1,N1), 
  492      [I1,I2,I3,I4,I5,I6]:arg('op2',A1,N2),
  493      [I1,I2,I3,I4,I5,I6]:arg('op3',A1,N3),
  494      [I1,I2,I3,I4,I5,I6]:arg('op4',A1,N4),
  495      [I1,I2,I3,I4,I5,I6]:arg('op5',A1,N5),
  496      [I1,I2,I3,I4,I5,I6]:arg('op6',A1,N6)],
  497     [I2 is I1+1,
  498      I3 is I2+1,
  499      I4 is I3+1,
  500      I5 is I4+1,
  501      I6 is I5+1]).
  502
  503% put five names together
  504rule([[I5]:arg(name,X,A5),[I5]:ins(A5,name),[I5]:arg('op1',A5,N5),
  505      [I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
  506      [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
  507      [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
  508      [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
  509     [],
  510     [[I1,I2,I3,I4,I5]:arg(name,X,A1), 
  511      [I1,I2,I3,I4,I5]:ins(A1,name),
  512      [I1,I2,I3,I4,I5]:arg('op1',A1,N1), 
  513      [I1,I2,I3,I4,I5]:arg('op2',A1,N2),
  514      [I1,I2,I3,I4,I5]:arg('op3',A1,N3),
  515      [I1,I2,I3,I4,I5]:arg('op4',A1,N4),
  516      [I1,I2,I3,I4,I5]:arg('op5',A1,N5)],
  517     [I2 is I1+1,
  518      I3 is I2+1,
  519      I4 is I3+1,
  520      I5 is I4+1]).
  521
  522% put four names together
  523rule([[I4]:arg(name,X,A4),[I4]:ins(A4,name),[I4]:arg('op1',A4,N4),
  524      [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3),
  525      [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
  526      [I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1)],
  527     [],
  528     [[I1,I2,I3,I4]:arg(name,X,A1), 
  529      [I1,I2,I3,I4]:ins(A1,name),
  530      [I1,I2,I3,I4]:arg('op1',A1,N1), 
  531      [I1,I2,I3,I4]:arg('op2',A1,N2),
  532      [I1,I2,I3,I4]:arg('op3',A1,N3),
  533      [I1,I2,I3,I4]:arg('op4',A1,N4)],
  534     [I2 is I1+1,
  535      I3 is I2+1,
  536      I4 is I3+1]).
  537
  538% put three names together
  539rule([[I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1),
  540      [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2),
  541      [I3]:arg(name,X,A3),[I3]:ins(A3,name),[I3]:arg('op1',A3,N3)],
  542     [],
  543     [[I1,I2,I3]:arg(name,X,A1), [I1,I2,I3]:ins(A1,name),
  544      [I1,I2,I3]:arg('op1',A1,N1), 
  545      [I1,I2,I3]:arg('op2',A1,N2),
  546      [I1,I2,I3]:arg('op3',A1,N3)],
  547     [I2 is I1+1,
  548      I3 is I2+1]).
  549
  550% put two names together
  551rule([[I1]:arg(name,X,A1),[I1]:ins(A1,name),[I1]:arg('op1',A1,N1),
  552      [I2]:arg(name,X,A2),[I2]:ins(A2,name),[I2]:arg('op1',A2,N2)],
  553     [],
  554     [[I1,I2]:arg(name,X,A1), [I1,I2]:ins(A1,name),
  555      [I1,I2]:arg('op1',A1,N1), 
  556      [I1,I2]:arg('op2',A1,N2)],
  557     [I2 is I1+1]).
  558
  559
  560% time expressions
  561rule([_:arg(timex,T,date(_:_,[I]:Y,[J]:M,[K]:Y))],[],[I:arg(year,M,Y),J:arg(month,T,M),K:arg(day,T,Y)],[]).
  562rule([_:arg(timex,T,date(_:_,_:_,[J]:M,[K]:Y))],[],[J:arg(month,T,M),K:arg(day,T,Y)],[]).
  563rule([_:arg(timex,T,date(_:_,[I]:Y,[J]:M,_:_))],[],[I:arg(year,T,Y),J:arg(month,T,M)],[]).
  564rule([_:arg(timex,T,date(_:_,[I]:Y,_:_,_:_))],[],[I:arg(year,T,Y)],[]).
  565rule([_:arg(timex,T,date(_:_,_:_,[J]:M,_:_))],[],[J:arg(month,T,M)],[]).
  566rule([_:arg(timex,T,date(_:_,_:_,_:_,[K]:D))],[],[K:arg(day,T,D)],[]).
  567
  568% fix months and days
  569rule([I:arg(month,X,'01')],[],[I:arg(month,X,1)],[]).
  570rule([I:arg(month,X,'02')],[],[I:arg(month,X,2)],[]).
  571rule([I:arg(month,X,'03')],[],[I:arg(month,X,3)],[]).
  572rule([I:arg(month,X,'04')],[],[I:arg(month,X,4)],[]).
  573rule([I:arg(month,X,'05')],[],[I:arg(month,X,5)],[]).
  574rule([I:arg(month,X,'06')],[],[I:arg(month,X,6)],[]).
  575rule([I:arg(month,X,'07')],[],[I:arg(month,X,7)],[]).
  576rule([I:arg(month,X,'08')],[],[I:arg(month,X,8)],[]).
  577rule([I:arg(month,X,'09')],[],[I:arg(month,X,9)],[]).
  578rule([I:arg(day,X,'01')],[],[I:arg(day,X,1)],[]).
  579rule([I:arg(day,X,'02')],[],[I:arg(day,X,2)],[]).
  580rule([I:arg(day,X,'03')],[],[I:arg(day,X,3)],[]).
  581rule([I:arg(day,X,'04')],[],[I:arg(day,X,4)],[]).
  582rule([I:arg(day,X,'05')],[],[I:arg(day,X,5)],[]).
  583rule([I:arg(day,X,'06')],[],[I:arg(day,X,6)],[]).
  584rule([I:arg(day,X,'07')],[],[I:arg(day,X,7)],[]).
  585rule([I:arg(day,X,'08')],[],[I:arg(day,X,8)],[]).
  586rule([I:arg(day,X,'09')],[],[I:arg(day,X,9)],[]).
  587
  588
  589% remove multiple instances 
  590rule([_:ins(X,':')],[_:ins(X,_)],[],[]).         % colon
  591rule([_:ins(X,namenam)],[_:ins(X,_)],[],[]).         % named entity
  592rule([_:ins(X,nameper)],[_:ins(X,_)],[],[]).         % named entity person
  593rule([_:ins(X,namegeo)],[_:ins(X,_)],[],[]).         % named entity location
  594rule([_:ins(X,nameorg)],[_:ins(X,_)],[],[]).         % named entity organization
  595rule([_:ins(X,nameart)],[_:ins(X,_)],[],[]).         % named entity product
  596rule([_:ins(X,nameeve)],[_:ins(X,_)],[],[]).         % named entity event
  597rule([_:ins(X,nametim)],[_:ins(X,_)],[],[]).         % named entity time
  598rule([_:ins(X,manner)],[_:ins(X,_)],[],[]).          % how to P
  599rule([_:ins(X,thing)],[_:ins(X,_)],[],[]).           % introduced by replace/2
  600rule([_:ins(X,Same)],[_:ins(X,Same)],[],[]).         % double
  601rule([_:ins(X,Y)],[_:ins(X,_)],[],[warning('removed instance: ~p attached to ~p',[Y,X])]).
  602rule([_:arg(wiki,X,'-')],[_:arg(wiki,X,'-')],[],[]).
  603
  604% units of measurement (distance)
  605rule([[I]:ins(X,inch)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,inch),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  606rule([[I]:ins(X,foot)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,foot),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  607rule([[I]:ins(X,yard)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,yard),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  608rule([[I]:ins(X,mile)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,mile),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  609rule([[I]:ins(X,leaque)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,leaque),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  610rule([[I]:ins(X,metre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,meter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  611rule([[I]:ins(X,meter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,meter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  612rule([[I]:ins(X,m)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,meter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  613rule([[I]:ins(X,nanometre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,nanometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  614rule([[I]:ins(X,nanometer)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,nanometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  615rule([[I]:ins(X,millimetre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,millimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  616rule([[I]:ins(X,millimeter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,millimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  617rule([[I]:ins(X,mm)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,millimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  618rule([[I]:ins(X,centimetre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,centimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  619rule([[I]:ins(X,centimeter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,centimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  620rule([[I]:ins(X,cm)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,centimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  621rule([[I]:ins(X,decimetre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,decimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  622rule([[I]:ins(X,decimeter)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,decimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  623rule([[I]:ins(X,dm)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,decimeter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  624rule([[I]:ins(X,kilometer)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,kilometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  625rule([[I]:ins(X,kilometre)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,kilometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  626rule([[I]:ins(X,km)],[_:arg(quant,X,_)],[[]:ins(X,'distance-quantity'),I:ins(Y,kilometer),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  627
  628% units of measurement (monetary)
  629rule([[I]:ins(X,franc)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,franc),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  630rule([[I]:ins(X,mark)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,mark),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  631rule([[I]:ins(X,ruble)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,ruble),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  632rule([[I]:ins(X,rupee)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,rupee),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  633rule([[I]:ins(X,yen)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,yen),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  634rule([[I]:ins(X,cent)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,cent),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  635rule([[I]:ins(X,euro)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,euro),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  636rule([[I]:ins(X,pound)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,pound),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  637rule([[I]:ins(X,yuan)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,yuan),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  638rule([[I]:ins(X,dollar)],[_:arg(quant,X,_)],[[]:ins(X,'monetary-quantity'),I:ins(Y,dollar),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  639
  640% units of measurement (temporal)
  641rule([[I]:ins(X,millenium)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,millenium),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  642rule([[I]:ins(X,century)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,century),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  643rule([[I]:ins(X,decade)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,decade),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  644rule([[I]:ins(X,year)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,year),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  645rule([[I]:ins(X,month)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,month),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  646rule([[I]:ins(X,week)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,week),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  647rule([[I]:ins(X,day)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,day),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  648rule([[I]:ins(X,night)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,night),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  649rule([[I]:ins(X,minute)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,minute),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  650rule([[I]:ins(X,second)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,second),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  651rule([[I]:ins(X,hour)],[_:arg(quant,X,_)],[[]:ins(X,'temporal-quantity'),I:ins(Y,hour),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  652
  653% units of measurement (mass)
  654rule([[I]:ins(X,kilogram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,kilogram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  655rule([[I]:ins(X,kg)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,kilogram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  656rule([[I]:ins(X,milligram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,milligram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  657rule([[I]:ins(X,mg)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,milligram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  658rule([[I]:ins(X,picogram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,picogram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  659rule([[I]:ins(X,gram)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,gram),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  660rule([[I]:ins(X,ton)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,ton),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  661rule([[I]:ins(X,tonne)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,tonne),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  662rule([[I]:ins(X,pound)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,pound),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  663rule([[I]:ins(X,ounce)],[_:arg(quant,X,_)],[[]:ins(X,'mass-quantity'),I:ins(Y,ounce),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  664
  665% units of measurement (volume)
  666rule([[I]:ins(X,gallon)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,gallon),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  667rule([[I]:ins(X,barrel)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,barrel),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  668rule([[I]:ins(X,bottle)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,bottle),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  669rule([[I]:ins(X,cup)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,cup),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  670rule([[I]:ins(X,'cubic-meter')],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,'cubic-meter'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  671rule([[I]:ins(X,litre)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,liter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  672rule([[I]:ins(X,millilitre)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,milliliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  673rule([[I]:ins(X,milliliter)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,milliliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  674rule([[I]:ins(X,ml)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,milliliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  675rule([[I]:ins(X,centilitre)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,centiliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  676rule([[I]:ins(X,centiliter)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,centiliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  677rule([[I]:ins(X,cl)],[_:arg(quant,X,_)],[[]:ins(X,'volume-quantity'),I:ins(Y,centiliter),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  678
  679% units of measurement (area)
  680rule([[I]:ins(X,hectare)],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,hectare),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  681rule([[I]:ins(X,acre)],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,acre),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  682rule([[I]:ins(X,'square-metre')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-meter'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  683rule([[I]:ins(X,'square-meter')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-meter'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  684rule([[I]:ins(X,'square-kilometre')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-kilometer'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  685rule([[I]:ins(X,'square-kilometer')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-kilometer'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  686rule([[I]:ins(X,'square-foot')],[_:arg(quant,X,_)],[[]:ins(X,'area-quantity'),I:ins(Y,'square-foot'),[]:arg(unit,X,Y)],[name(I,L),name(Y,[117|L])]).
  687
  688
  689% percentage
  690rule([I:ins(X,percent),J:arg(quant,X,Y)],[],[I:ins(X,'percentage-entity'),J:arg(value,X,Y)],[]).
  691
  692% us dollars
  693rule([[I]:arg(name,M,N),J:arg(wiki,M,'-')],[_:ins(N,name),_:arg(op1,N,'"us"'),_:ins(M,'monetary-quantity'),_:arg(unit,M,U),_:ins(U,dollar)],
  694     [[]:arg(mod,U,C),[]:ins(C,country),I:arg(name,C,N),J:arg(wiki,C,'"United_States"')],[name(I,Codes),name(C,[112|Codes])]).
  695
  696% countries
  697rule([I:ins(C,location)],[_:arg(name,C,N),_:ins(N,name),_:arg(op1,N,Name)],[I:ins(C,Type)],[nationality(_,_,Country,_,Type),addQuotes(Country,Name)]).
  698rule([I:arg(wiki,X,'-')],[_:ins(X,Type),_:arg(name,X,N),_:ins(N,name),_:arg(op1,N,Name)],[I:arg(wiki,X,W)],[nationality(_,_,Country,Wiki,Type),addQuotes(Country,Name),addQuotes(Wiki,W)]).
  699
  700% wikification
  701rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(op4,N,Name4),_:arg(op5,N,Name5),_:arg(op6,N,Name6),_:arg(name,X,N)],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3,Name4,Name5,Name6]),\+ Type=Old, warning('added 6 wiki ~p ~p',[Type,Wiki])]).
  702rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(op4,N,Name4),_:arg(op5,N,Name5),_:arg(name,X,N)],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3,Name4,Name5]),\+ Type=Old, warning('added 5 wiki ~p ~p',[Type,Wiki])]).
  703rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(op4,N,Name4),_:arg(name,X,N)],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3,Name4]),\+ Type=Old, warning('added 4 wiki ~p ~p',[Type,Wiki])]).
  704rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(op3,N,Name3),_:arg(name,X,N),not(_:arg(op4,N,_))],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2,Name3]),\+ Type=Old, warning('added 3 wiki ~p ~p',[Type,Wiki])]).
  705rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name1),_:arg(op2,N,Name2),_:arg(name,X,N),not(_:arg(op3,N,_))],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name1,Name2]),\+ Type=Old]).
  706rule([I:arg(wiki,X,'-'),J:ins(X,Old)],[_:arg(op1,N,Name),_:arg(name,X,N),not(_:arg(op2,N,_))],[I:arg(wiki,X,Wiki),J:ins(X,Type)],[wiki(Type,Wiki,[Name]),\+ Type=Old]).
  707
  708% modals
  709rule([I:arg('ARG1',E,X),J:ins(E,necessary)],[],[I:arg('ARG2',E,X),J:ins(E,'obligate-01')],[]).
  710rule([I:arg('ARG1',E,X),J:ins(E,obligatory)],[],[I:arg('ARG2',E,X),J:ins(E,'obligate-01')],[]).
  711rule([J:ins(E,permissible)],[_:arg('ARG1',E,_)],[J:ins(E,'permit-01')],[]).
  712rule([J:ins(E,possible)],[_:arg('ARG1',E,_)],[J:ins(E,'possible-01')],[]).
  713rule([J:ins(E,impossible)],[_:arg('ARG1',E,_)],[J:ins(E,'possible-01'),[]:arg('polarity',E,'-')],[]).
  714rule([J:ins(E,likely)],[_:arg('ARG1',E,_)],[J:ins(E,'likely-01')],[]).
  715
  716% verbalization
  717rule([[I]:ins(X,Old)],[],[[I]:ins(X,New),[]:arg(Rel1,X,Y),[]:ins(Y,Ins1),[]:arg(Rel2,Y,Z),[]:ins(Z,Ins2)],[verbalize(Old,New,Rel1,Ins1,Rel2,Ins2),name(I,L),name(Y,[118|L]),name(Z,[119|L])]).
  718rule([[I]:ins(X,Old)],[],[[I]:ins(X,New),[]:arg(Rel,X,Y),[]:ins(Y,Ins)],[verbalize(Old,New,Rel,Ins),name(I,L),name(Y,[118|L])]).
  719rule([I:ins(X,Old)],[],[I:ins(X,New),[]:arg(polarity,X,'-')],[verbalize(Old,New,'polarity-')]).
  720rule([I:ins(X,Old)],[],[I:ins(X,New)],[verbalize(Old,New)]).
  721
  722% affixes
  723rule([I:ins(X,Old)],[],[I:ins(X,New),[]:arg(polarity,X,'-')],[negprefix(_,Old,_,New),warning('added prefix ~p',[Old])]).
  724rule([I:ins(X,Old)],[],[I:ins(X,New),[]:arg(polarity,X,'-')],[negsuffix(_,Old,_,New),warning('added suffix ~p',[Old])]).
  725rule([[I]:ins(X,A)],[],[[I]:ins(X,Type),[]:arg(name,X,N),[]:ins(N,name),[]:arg(op1,N,Q),[]:arg(wiki,X,W)],[nationality(A,a,C,D,Type),name(I,L),name(N,[112|L]),addQuotes(C,Q),addQuotes(D,W)]).
  726
  727% other replacements
  728rule([I:arg(of,X,Y)],[],[I:arg(poss,X,Y)],[]).
  729rule([I:ins(X,begin)],[],[I:ins(X,'begin-01')],[]).
  730rule([I:ins(X,end)],[],[I:ins(X,'end-01')],[]).
  731rule([I:ins(X,'etc.')],[],[I:ins(X,'et-cetera')],[]).
  732rule([I:ins(X,'etc')],[],[I:ins(X,'et-cetera')],[]).
  733rule([I:ins(X,'(')],[],[I:ins(X,lrb)],[]).
  734rule([I:ins(X,')')],[],[I:ins(X,rrb)],[]).
  735rule([I:ins(X,':')],[],[I:ins(X,and)],[]).
  736rule([I:ins(X,';')],[],[I:ins(X,and)],[]).
  737rule([I:ins(X,',')],[],[I:ins(X,and)],[]).
  738rule([I:ins(X,'/')],[],[I:ins(X,slash)],[]).
  739rule([I:ins(X,'/-01')],[],[I:ins(X,slash)],[]).
  740rule([I:ins(X,namenam)],[],[I:ins(X,thing)],[]).
  741rule([I:ins(X,nameper)],[],[I:ins(X,person)],[]).
  742rule([I:ins(X,namegeo)],[],[I:ins(X,location)],[]).
  743rule([I:ins(X,nameart)],[],[I:ins(X,product)],[]).
  744rule([I:ins(X,nameeve)],[],[I:ins(X,event)],[]).
  745rule([I:ins(X,nameorg)],[],[I:ins(X,organization)],[]).
  746rule([I:ins(X,nametim)],[],[I:ins(X,time)],[]).
  747rule([I:arg(':',X,Y)],[],[I:arg(mod,X,Y)],[]).
  748rule([I:arg('-',X,Y)],[],[I:arg(mod,X,Y)],[]).
  749rule([I:arg('--',X,Y)],[],[I:arg(mod,X,Y)],[]).
  750rule([I:ins(X,Old)],[],[I:ins(X,New)],[mfs(Old,New)]).
  751rule([I:ins(X,Old)],[],[I:ins(X,New)],[name(Old,Codes),append(Prefix,"-00",Codes),append(Prefix,"-01",NewCodes),name(New,NewCodes)]).
  752
  753% role91
  754rule([[I]:ins(X,Role),J:arg(poss,X,Y)],[],[I:ins(X,person),[]:ins(E,Rel),[]:arg('ARG0-of',X,E),J:arg('ARG1',E,Y),[]:ins(Z,Role),[]:arg(Arg,E,Z)],[role91(Rel,Arg,Role),name(I,Codes),name(E,[110|Codes]),name(Z,[111|Codes])]).
  755rule([[I]:ins(X,Role),J:arg(for,X,Y)],[],[I:ins(X,person),[]:ins(E,Rel),[]:arg('ARG0-of',X,E),J:arg('ARG1',E,Y),[]:ins(Z,Role),[]:arg(Arg,E,Z)],[role91(Rel,Arg,Role),name(I,Codes),name(E,[110|Codes]),name(Z,[111|Codes])]).
  756rule([[I]:ins(X,Role)],[],[I:ins(X,person),[]:ins(E,Rel),[]:arg('ARG0-of',X,E),[]:ins(Z,Role),[]:arg(Arg,E,Z)],[role91(Rel,Arg,Role),name(I,Codes),name(E,[110|Codes]),name(Z,[111|Codes])]).
  757
  758% fix etc.
  759%
  760rule([_:arg(rel,X,E),I:arg(example,S,X)],[[J]:ins(E,'et-cetera')],[I:arg(example,S,New),[]:ins(New,and),[]:arg(op1,New,X),[]:arg(op2,New,E)],[name(J,L),name(New,[97|L])]).
  761
  762% remove wiki- (experimental)
  763%rule([_:arg(wiki,_,'-')],[],[],[]).
  764
  765
  766
  767/* ========================================================================
  768   Translate DRSs into AMR formulas 
  769======================================================================== */
  770
  771drs2amr(alfa(_,B1,B2),P,T1,T2,N,H):- !, 
  772   drs2amr(merge(B1,B2),P,T1,T2,N,H).
  773
  774drs2amr(_:drs(_,Conds),P,T1,T3,N,H):- !, 
  775   conds2amr(Conds,P,[],T2,N,[],H),
  776   append(T1,T2,T3).
  777
  778drs2amr(merge(B1,B2),P,T1,T3,N1-N3,H2):- !, 
  779   drs2amr(B1,P,T1,T2,N1-N2,_), 
  780   drs2amr(B2,P,T2,T3,N2-N3,H2).
  781
  782drs2amr(sdrs([],Rel),P,T1,T2,N,Root):- !,
  783   conds2amr(Rel,P,T1,T2,N,[],Root).
  784
  785drs2amr(sdrs([D|L],R),P,T1,T3,N1-N3,H):- !,
  786   drs2amr(D,P,T1,T2,N1-N2,_),
  787   drs2amr(sdrs(L,R),P,T2,T3,N2-N3,H).
  788
  789drs2amr(lab(K,B),P,T1,T4,N1-N2,K):- !,
  790   drs2amr(B,P,[],T2,N1-N2,H),
  791   replace([replace(H,K)|T2],T3),
  792   append(T1,T3,T4).
  793
  794drs2amr(sub(B1,B2),P,T1,T3,N1-N3,H):-
  795   drs2amr(B1,P,T1,T2,N1-N2,H),
  796   drs2amr(B2,P,T2,T3,N2-N3,_).
  797
  798
  799/* ========================================================================
  800   Translate DRS-Conditions into AMR formulas 
  801======================================================================== */
  802  
  803conds2amr([],_,T1,T3,N-N,Heads,Root):- 
  804   getRoots(T1,Roots),
  805%  write(roots:Roots),nl,
  806%  write(amr:T1),nl,
  807   determineRoot(T1,T3,Roots,Heads,Root), !.
  808
  809conds2amr([],_,T,T,N-N,Heads,Root):- 
  810   pickHead(Heads,Root), !,
  811   warning('cannot determine head: ~p',[T]).
  812
  813conds2amr([_:Cond|L],P,T1,T3,N1-N3,Heads,Head):-
  814   cond2amr(Cond,P,T1,T2,N1-N2,E), 
  815   conds2amr(L,P,T2,T3,N2-N3,[E|Heads],Head).
  816
  817  
  818/* ========================================================================
  819   Determine Root of DRS (and fix in case of multiple roots)
  820======================================================================== */
  821
  822determineRoot(AMR,AMR,[Root],_,Root):-   % if there is one root and it is a
  823   checkInstance(Root,AMR,[]), !.        % proper root, then we are happy.
  824
  825determineRoot(AMR,AMR,[Root],_,Root):-   % one
  826   warning('proposed root ~p not covering all vertices',[Root]), !.
  827
  828determineRoot(AMR1,AMR2,Roots,_Heads,Root):-
  829   connected(AMR1), !,
  830   select(Root,Roots,FixRoots),
  831%  write(trying:Root),nl,
  832   inverseRoles(FixRoots,AMR1,AMR2), 
  833%  write(check:AMR2),nl,
  834   checkInstance(Root,AMR2,[]), !.
  835
  836determineRoot(AMR,AMR,[Root|_],_Heads,Root):-
  837   connected(AMR), !,
  838   warning('connected but unable to inverse roles',[]).
  839
  840determineRoot(AMR1,AMR2,Roots,Heads,Root):-
  841   Roots=[R1,R2], !,
  842   (member(_:[Num]:_,Heads),!;Num=1),
  843   name(Num,Codes), append("root",Codes,RootCodes), name(Root,RootCodes),
  844   warning('fixed multiple roots: ~p with new root ~p',[Roots,Root]),
  845   AMR2=[[]:ins(Root,'multi-sentence'),[]:arg(snt1,Root,R1),[]:arg(snt2,Root,R2)|AMR1].
  846
  847determineRoot(AMR1,AMR2,Roots,Heads,Root):-
  848   Roots=[R1,R2,R3], !,
  849   (member(_:[Num]:_,Heads),!;Num=1),
  850   name(Num,Codes), append("root",Codes,RootCodes), name(Root,RootCodes),
  851   warning('fixed multiple roots: ~p',[Roots]),
  852   AMR2=[[]:ins(Root,'multi-sentence'),[]:arg(snt1,Root,R1),[]:arg(snt2,Root,R2),[]:arg(snt3,Root,R3)|AMR1].
  853
  854determineRoot(AMR,AMR,Roots,_,Root):-
  855   Roots=[Root|_], !,
  856   warning('unable to fix multiple roots: ~p',[Roots]).
  857
  858
  859/* ========================================================================
  860   Check if AMR is connected
  861======================================================================== */
  862
  863connected(AMR):-
  864   countVertices(AMR,[],N),
  865   member(_:ins(X,_),AMR),
  866   reachable(X,AMR,[],Reachable),
  867   length(Reachable,N), !.
  868
  869%connected(A):-
  870%   warning('not connected: ~o',[A]).
  871
  872
  873/* ========================================================================
  874   Make a guess as to what the head of a list of DRS-conditions is...
  875======================================================================== */
  876
  877pickHead(Heads,Event):- member(closing:_:Event,Heads), !.
  878pickHead(Heads,Event):- member(event:[_]:Event,Heads), !.
  879pickHead(Heads,Event):- member(noun:[_]:Event,Heads), !.
  880pickHead(Heads,Event):- member(named:[_]:Event,Heads), !.
  881pickHead([_:[_]:Head|_],Head):- !.
  882pickHead([_:_:Head|_],Head):- !.
  883pickHead(_,_).
  884
  885
  886/* ========================================================================
  887   Translate a DRS-Condition into AMR formulas 
  888======================================================================== */
  889
  890cond2amr(I:nec(Drs),P,T1,[I:ins(E1,'recommend-01'),I:arg('ARG1',E1,E2)|T2],N1-N3,complex:I:E1):-
  891   I=[Index], member(Index:F,P), member(tok:should,F), !,
  892   label(N1,e,E1,N2), 
  893   drs2amr(Drs,P,T1,T2,N2-N3,E2).
  894
  895cond2amr(I:nec(Drs),P,T1,[I:ins(E1,'obligate-01'),I:arg('ARG2',E1,E2)|T2],N1-N3,complex:I:E1):- !,
  896   label(N1,e,E1,N2), 
  897   drs2amr(Drs,P,T1,T2,N2-N3,E2).
  898
  899cond2amr(I:pos(Drs),P,T1,[I:ins(E1,'possible-01'),I:arg('ARG1',E1,E2)|T2],N1-N3,complex:I:E1):- !,
  900   label(N1,e,E1,N2), 
  901   drs2amr(Drs,P,T1,T2,N2-N3,E2).
  902
  903cond2amr(I:not(Drs),P,T1,[I:arg(polarity,E,'-')|T2],N1-N2,complex:I:E):- !,
  904   drs2amr(Drs,P,T1,T2,N1-N2,E).
  905
  906cond2amr(I:prop(E,Drs),P,T1,T4,N,complex:I:E):- !,
  907   drs2amr(Drs,P,[],T2,N,H),
  908   append(T1,T2,T3),
  909   replace([replace(H,E)|T3],T4).
  910
  911cond2amr(I:or(Drs1,Drs2),P,T1,[I:ins(E,or),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
  912   label(N1,e,E,N2),
  913   drs2amr(Drs1,P,T1,T2,N2-N3,H1),
  914   drs2amr(Drs2,P,T2,T3,N3-N4,H2).
  915
  916cond2amr(I:imp(Drs1,Drs2),P,T1,[I:ins(E,condition),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
  917   label(N1,e,E,N2),
  918   drs2amr(Drs1,P,T1,T2,N2-N3,H1),
  919   drs2amr(Drs2,P,T2,T3,N3-N4,H2).
  920
  921cond2amr(I:whq(Drs1,Drs2),P,T1,[I:ins(E,question),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
  922   label(N1,e,E,N2),
  923   drs2amr(Drs1,P,T1,T2,N2-N3,H1),
  924   drs2amr(Drs2,P,T2,T3,N3-N4,H2).
  925
  926cond2amr(I:duplex(_,Drs1,_,Drs2),P,T1,[I:ins(E,duplex),I:arg('op1',E,H1),I:arg('op2',E,H2)|T3],N1-N4,complex:I:E):- !,
  927   label(N1,e,E,N2),
  928   drs2amr(Drs1,P,T1,T2,N2-N3,H1),
  929   drs2amr(Drs2,P,T2,T3,N3-N4,H2).
  930
  931cond2amr(I:timex(X,Date),_,T,[I:ins(X,'date-entity'),I:arg(timex,X,Date)|T],N1-N2,timex:I:E):- !, label(N1,e,E,N2).
  932
  933cond2amr(I:named(X,S1,Sort,_),_,T,[I:ins(X,Sym),I:arg(name,X,N),I:ins(N,name),I:arg(op1,N,S2),I:arg(wiki,X,'-')|T],N1-N2,named:I:N):- !, 
  934   addQuotes(S1,S2), label(N1,n,N,N2), name(Sort,Codes), append("name",Codes,SymCodes), name(Sym,SymCodes).
  935
  936cond2amr(I:card(X,C,_),_,T,[I:arg(quant,X,C)|T],N-N,card:I:X):- !.
  937
  938cond2amr(I:eq(X,Y),_,T,[I:ins(E,'equal-01'),I:arg('ARG1',E,X),I:arg('ARG2',E,Y)|T],N1-N2,equal:I:E):- !, label(N1,e,E,N2).      
  939
  940cond2amr(I:pred(X,S1,n,_),_,T,[I:ins(X,S2)|T],N-N,noun:I:X):- 
  941   name(S1,Codes), member(47,Codes), !, addQuotes(S1,S2).
  942
  943cond2amr(I:pred(X,closing,v,99),_,T,T,N-N,closing:I:X):- !.
  944cond2amr(I:pred(X,interrogative,r,1),_,T,[I:arg(mode,X,'interrogative')|T],N-N,mod:I:X):- !.
  945cond2amr(I:pred(X,S,r,2),_,T,[I:ins(E,S),I:arg(mod,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
  946cond2amr(I:pred(X,S,r,_),_,T,[I:ins(E,S),I:arg(manner,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
  947cond2amr(I:pred(X,amount,n,3),_,T,[I:ins(E,much),I:arg(quant,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
  948cond2amr(I:pred(X,quantity,n,1),_,T,[I:ins(E,many),I:arg(quant,X,E)|T],N1-N2,mod:I:E):- !, label(N1,e,E,N2).
  949cond2amr(I:pred(X,S,n,_),_,T,[I:ins(X,S)|T],N-N,noun:I:X):- !.
  950cond2amr(I:pred(E,S1,v,_),_,T,[I:ins(E,S2)|T],N-N,event:I:E):- !, atom_concat(S1,'-00',S2).
  951cond2amr(I:pred(E,S,a,_),_,T,[I:ins(E,S)|T],N-N,mod:I:E):- !.
  952
  953%cond2amr(I:rel(X,Y,subset_of1,1),_,T,[I:ins(Y,and),I:arg('op1',Y,X)|T],N-N,rel:I:X):- !.
  954%cond2amr(I:rel(X,Y,subset_of2,1),_,T,[I:ins(Y,and),I:arg('op1',Y,X)|T],N-N,rel:I:X):- !.
  955cond2amr(I:rel(X,Y,of,1),_,T,[I:arg(poss,X,Y)|T],N-N,rel:I:X):- !.
  956cond2amr(I:rel(X,Y,'Holder',_),_,T,[I:arg(domain,X,Y)|T],N-N,rel:I:Y):- !.
  957cond2amr(I:rel(X,Y,'Actor',_),_,T,[I:arg('ARG0',X,Y)|T],N-N,rel:I:X):- !.
  958cond2amr(I:rel(X,Y,'Theme',_),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
  959cond2amr(I:rel(X,Y,'Holder',_),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
  960cond2amr(I:rel(X,Y,'Topic',_),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
  961cond2amr(I:rel(X,Y,'Recipient',_),_,T,[I:arg('ARG2',X,Y)|T],N-N,rel:I:X):- !.
  962cond2amr(I:rel(X,Y,P,_),_,T,[I:arg(P,X,Y)|T],N-N,rel:I:X):- !.
  963
  964cond2amr(I:role(X,Y,'Holder',    1),_,T,[I:arg('domain',X,Y)|T],N-N,rel:I:X):- !.
  965cond2amr(I:role(X,Y,'Actor',     1),_,T,[I:arg('ARG0',X,Y)|T],N-N,rel:I:X):- !.
  966cond2amr(I:role(X,Y,'Theme',     1),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
  967cond2amr(I:role(X,Y,'Pivot',     1),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
  968cond2amr(I:role(X,Y,'Topic',     1),_,T,[I:arg('ARG1',X,Y)|T],N-N,rel:I:X):- !.
  969cond2amr(I:role(X,Y,'Recipient', 1),_,T,[I:arg('ARG2',X,Y)|T],N-N,rel:I:X):- !.
  970cond2amr(I:role(X,Y,'Time',      1),_,T,[I:arg('time',X,Y)|T],N-N,rel:I:X):- !.
  971cond2amr(I:role(X,Y,'Location',  1),_,T,[I:arg('location',X,Y)|T],N-N,rel:I:X):- !.
  972cond2amr(I:role(X,Y,'Manner',    1),_,T,[I:arg('manner',X,Y)|T],N-N,rel:I:X):- !.
  973cond2amr(I:role(X,Y,'Pivot',    -1),_,T,[I:arg('domain-of',X,Y)|T],N-N,rel:I:X):- !.
  974cond2amr(I:role(X,Y,'Holder',   -1),_,T,[I:arg('domain-of',X,Y)|T],N-N,rel:I:X):- !.
  975cond2amr(I:role(X,Y,'Actor',    -1),_,T,[I:arg('ARG0-of',X,Y)|T],N-N,rel:I:X):- !.
  976cond2amr(I:role(X,Y,'Theme',    -1),_,T,[I:arg('ARG1-of',X,Y)|T],N-N,rel:I:X):- !.
  977cond2amr(I:role(X,Y,'Topic',    -1),_,T,[I:arg('ARG1-of',X,Y)|T],N-N,rel:I:X):- !.
  978cond2amr(I:role(X,Y,'Recipient',-1),_,T,[I:arg('ARG2-of',X,Y)|T],N-N,rel:I:X):- !.
  979cond2amr(I:role(X,Y,'Time',     -1),_,T,[I:arg('time-of',X,Y)|T],N-N,rel:I:X):- !.
  980%cond2amr(I:role(X,Y,Role,       1),_,T,[I:arg(Role,X,Y)|T],N-N,rel:I:X):- !.
  981%cond2amr(I:role(X,Y,Role,      -1),_,T,[I:arg(Role,X,Y)|T],N-N,rel:I:X):- !.
  982
  983cond2amr(I:X,_,T,T,N-N,unknown:I:_):- warning('cond2amr/3 failed for ~p',[X]).
  984
  985cond2amr(rel(X,Y,P),_,T,[[]:ins(E,P),[]:arg('op1',E,X),[]:arg('op2',E,Y)|T],N1-N2,rel:[]:E):- !, label(N1,e,E,N2).
  986
  987
  988/* ========================================================================
  989   Adding double quotes for names
  990======================================================================== */
  991
  992addQuotes(Name,QuotedName):-
  993   name(Name,NameCodes),
  994   append([34|NameCodes],[34],QuotedCodes),
  995   name(QuotedName,QuotedCodes).
  996
  997
  998/* ========================================================================
  999   Print AMR formula (assumes unique head)
 1000======================================================================== */
 1001
 1002getRoot(AMR,E):- 
 1003   member(_:ins(E,_),AMR), 
 1004   \+ member(_:arg(_,_,E),AMR).
 1005
 1006getRoot(AMR,E):- 
 1007   member(_:arg(_,E,_),AMR), 
 1008   \+ member(_:ins(E,_), AMR),
 1009   \+ member(_:arg(_,_,E),AMR).
 1010
 1011getRoots(AMR,Roots):-
 1012   findall(H,getRoot(AMR,H),Hs),
 1013   sort(Hs,Roots).
 1014
 1015
 1016/* ========================================================================
 1017   Check AMR
 1018======================================================================== */
 1019
 1020checkInstance(E,AMR1,AMR3):- select(_:ins(E,_),AMR1,AMR2), !, checkInstance(E,AMR2,AMR3).
 1021checkInstance(E,AMR1,AMR2):- checkArgs(E,AMR1,AMR2).
 1022
 1023checkArgs(E,AMR1,AMR4):- select(_:arg(_,E,X),AMR1,AMR2), !, checkInstance(X,AMR2,AMR3), checkArgs(E,AMR3,AMR4).
 1024checkArgs(_,AMR,AMR).
 1025
 1026
 1027/* ========================================================================
 1028   Print AMR formula (assumes unique head)
 1029======================================================================== */
 1030
 1031printAMR(AMR0,Stream):- 
 1032   sort(AMR0,AMR1),
 1033   getRoot(AMR1,Head), !,
 1034   printInstance(Head,AMR1,AMR2,5,Stream),
 1035   nl(Stream),
 1036   ( AMR2=[]; AMR2\=[], warning('parts of AMR not printed: ~p',[AMR2]) ).
 1037
 1038printAMR(_,Stream):- 
 1039   warning('cannot print AMR',[]),
 1040   BackupAMR=[[]:ins(x,and)],
 1041   printAMR(BackupAMR,Stream).
 1042
 1043
 1044/* ========================================================================
 1045   Print AMR instance
 1046======================================================================== */
 1047
 1048printInstance(E,AMR1,AMR4,Level,Stream):-
 1049   select(_:ins(E,S),AMR1,AMR2), !,
 1050   format(Stream,'(~p / ~p',[E,S]),
 1051   sortArgs(AMR2,E,AMR3),
 1052   printArgs(E,AMR3,AMR4,Level,Stream).
 1053
 1054printInstance(E,AMR1,AMR2,_Level,Stream):-
 1055   format(Stream,'~p',[E]),
 1056   AMR1=AMR2.
 1057
 1058
 1059/* ========================================================================
 1060   Place wiki before name relation
 1061======================================================================== */
 1062
 1063sortArgs(AMR1,E,[I:arg(wiki,E,X)|AMR3]):-
 1064   select(I:arg(wiki,E,X),AMR1,AMR2), !,
 1065   sortArgs(AMR2,E,AMR3).
 1066
 1067sortArgs(AMR1,E,[I:arg(name,E,X)|AMR3]):-
 1068   select(I:arg(name,E,X),AMR1,AMR2), !,
 1069   sortArgs(AMR2,E,AMR3).
 1070
 1071sortArgs(A,_,A).
 1072
 1073
 1074/* ========================================================================
 1075   Print AMR arguments of an instance
 1076======================================================================== */
 1077
 1078printArgs(E,AMR1,AMR4,Level,Stream):-
 1079   select(_:arg(S,E,X),AMR1,AMR2), !,
 1080   nl(Stream), tab(Stream,Level),
 1081   format(Stream,':~p ',[S]),
 1082   NewLevel is Level + 5,
 1083   printInstance(X,AMR2,AMR3,NewLevel,Stream),
 1084   printArgs(E,AMR3,AMR4,Level,Stream).
 1085
 1086printArgs(_,AMR,AMR,_,Stream):- 
 1087   write(Stream,')')