2/*========================================================================
    3   File Search Paths
    4========================================================================*/
    5
    6file_search_path(semlib,     'src/prolog/lib').
    7file_search_path(nutcracker, 'src/prolog/nutcracker').
    8file_search_path(boxer,      'src/prolog/boxer').
    9file_search_path(knowledge,  'src/prolog/boxer/knowledge').
   10
   11/*========================================================================
   12   Load other libraries
   13========================================================================*/
   14
   15:- use_module(library(lists),[select/3,append/3]).   16:- use_module(boxer(slashes)).   17:- use_module(boxer(printDrs),[printDrs/2]).   18:- use_module(nutcracker(callInference),[callTPandMB/7]).   19:- use_module(semlib(options),[option/2,parseOptions/2,setOption/3,
   20                               showOptions/1,setDefaultOptions/1]).   21
   22:- dynamic chart/5.   23
   24/* ----------------------------------------------------------------------------------
   25   Simple Lexicon
   26---------------------------------------------------------------------------------- */
   27
   28lex(every,  (s/(s\np))/n, (x1-C)-((((x1-B)-drs([],[imp(drs([[]:x1],[pos(C)]),B)]))-D)-D) ).
   29
   30lex(two,    (s/(s\np))/n, (x1-C)-((((x1-B)-drs([[]:x2],[pred(x2,two,n,1),imp(drs([[]:x1],[rel(x1,x2,member,1)]),C),imp(drs([[]:x1],[rel(x1,x2,member,1)]),B)]))-D)-D) ).
   31lex(three,  (s/(s\np))/n, (x1-C)-((((x1-B)-drs([[]:x2],[pred(x2,three,n,1),imp(drs([[]:x1],[rel(x1,x2,member,1)]),C),imp(drs([[]:x1],[rel(x1,x2,member,1)]),B)]))-D)-D) ).
   32lex(four,   (s/(s\np))/n, (x1-C)-((((x1-B)-drs([[]:x2],[pred(x2,four,n,1),imp(drs([[]:x1],[rel(x1,x2,member,1)]),C),imp(drs([[]:x1],[rel(x1,x2,member,1)]),B)]))-D)-D) ).
   33
   34lex(a,      np/n, (x1-C)-((x1-B)-drs([[]:x1],[pos(C),pos(B)]))           ).
   35
   36lex(big,    n/n,  (x1-B)-(x1-drs([],[pred(x1,big,a,0),pos(B)]))                ).
   37
   38lex(man,    n,    x1-drs([],[pred(x1,man,n,0)])                                ).
   39lex(men,    n,    x1-drs([],[pred(x1,man,n,0)])                                ).
   40lex(woman,  n,    x1-drs([],[pred(x1,woman,n,0)])                              ).
   41
   42lex(someone, np,   (x1-B)-drs([[]:x1],[pred(x1,person,n,1),pos(B)])  ).
   43
   44lex(herself, np,   (x1-B)-drs([],[pred(x1,female,n,0),pos(B)])  ).
   45
   46lex(mia,    np,   (x1-B)-drs([[]:x1],[named(x1,mia,per,0),pos(B)])  ).
   47lex(lou,    np,   (x1-B)-drs([[]:x1],[named(x1,lou,per,0),pos(B)])  ).
   48lex(andy,   np,   (x1-B)-drs([[]:x1],[named(x1,andy,per,0),pos(B)]) ).
   49
   50lex(mia,    s/(s\np),   ((x1-B)-drs([[]:x1],[named(x1,mia,per,0),pos(B)])-C)-C      ).
   51
   52lex(everyone, s/(s\np),   ((x1-B)-drs([],[imp(drs([[]:x1],[pred(x1,person,n,1)]),B)])-C)-C      ).
   53
   54lex(slowly, (s\np)\(s\np), ((x2-drs([],[pred(x2,slow,a,0),pos(C)]))-B)-((x2-C)-B) ).
   55lex(slowly, s\s, ((x2-drs([],[pred(x2,slow,a,0),pos(C)]))-B)-((x2-C)-B) ).
   56
   57lex(smokes, s\np, (((x1-drs([[]:x2],[pred(x2,smoke,v,0),rel(x2,x1,theme,0),pos(B)]))-C)-((x2-B)-C))         ).
   58lex(smoke,  s\np, (((x1-drs([[]:x2],[pred(x2,smoke,v,0),rel(x2,x1,theme,0),pos(B)]))-C)-((x2-B)-C))         ).
   59
   60lex(saw,    (s\np)/np, ((x1-drs([],[rel(x2,x1,theme,0),pos(D)]))-B)-(((x1-drs([[]:x2],[pred(x2,see,v,0),rel(x2,x1,agent,0),pos(B)]))-C)-((x2-D)-C)) ).
   61
   62lex(and,    (np/np)\np, ((x1-drs([],[rel(x1,x2,member,1)]))-B1)-(((x1-drs([],[rel(x1,x2,member,1)]))-B2)-((x1-B)-drs([[]:x2],[pos(B1),pos(B2),imp(drs([[]:x1],[rel(x1,x2,member,1)]),B)])))).
   63
   64lex('.',    t\s,   ((x2-drs([],[pred(x2,event,v,0)]))-B)-B  ).
   65
   66/* ----------------------------------------------------------------------------------
   67   Combinatory Rules
   68---------------------------------------------------------------------------------- */
   69
   70combine(A,B,C,D,E,fa(D,E)):- fa(A,B,C).
   71combine(A,B,C,D,E,ba(D,E)):- ba(A,B,C).
   72combine(A,B,C,D,E,fc(D,E)):- fc(A,B,C).
   73
   74/* ----------------------------------------------------------------------------------
   75   CCG
   76---------------------------------------------------------------------------------- */
   77
   78fa((A/B):X-Y, B:X, A:Y).
   79ba(A:X, (B\A):X-Y, B:Y).
   80fc((A/B):X-Y, (B/C):Z-X, (A/C):Z-Y).
   81
   82
   83/* ----------------------------------------------------------------------------------
   84   Examples
   85---------------------------------------------------------------------------------- */
   86
   87example( 1, [mia,smokes,'.']).
   88example( 2, [two,men,smoke,'.']).
   89example( 3, [every,man,smokes,'.']).
   90example( 4, [a,woman,smokes,'.']).
   91example( 5, [mia,saw,a,man,'.']).
   92example( 6, [every,big,man,smokes,'.']).
   93example( 7, [every,big,man,saw,a,big,man,'.']).
   94example( 8, [two,men,saw,a,woman,'.']).
   95example( 9, [three,men,saw,a,woman,'.']).
   96example(10, [four,men,saw,a,woman,'.']).
   97
   98example(20, [lou,and,andy,smoke,'.']).
   99example(21, [lou,and,andy,saw,a,woman,'.']).
  100
  101example(31, [two,men,smoke,'.']).
  102example(32, [a,man,smokes,'.']).
  103example(33, [three,men,smoke,'.']).
  104
  105example(41, [mia,smokes,slowly,'.']).
  106example(42, [a,man,smokes,slowly,'.']).
  107example(43, [every,man,smokes,slowly,'.']).
  108example(44, [mia,saw,a,man,slowly,'.']).
  109example(45, [every,woman,saw,a,man,slowly,'.']).
  110
  111example(101,[smokes,mia,'.']).
  112example(102,[mia,saw,every,man,'.']).
  113
  114
  115/* ----------------------------------------------------------------------------------
  116   Test
  117---------------------------------------------------------------------------------- */
  118
  119example(Example):-
  120   setDefaultOptions(nutcracker), 
  121   example(Example,Sentence),
  122   retractall(chart(_,_,_,_,_)),
  123   initChart(Sentence,0,N),
  124   parse(1,1,N,_), !.
  125
  126test(Sentence):-
  127   setDefaultOptions(nutcracker), 
  128   retractall(chart(_,_,_,_,_)),
  129   initChart(Sentence,0,N),
  130   parse(1,1,N,_), !.
  131
  132/* ----------------------------------------------------------------------------------
  133   RTE
  134---------------------------------------------------------------------------------- */
  135
  136rte(E1,E2):-
  137   setDefaultOptions(nutcracker), 
  138   setOption(nutcracker,'--tp',vampire),
  139   setOption(nutcracker,'--mb',paradox3),
  140   example(E1,S1),
  141   retractall(chart(_,_,_,_,_)),
  142   initChart(S1,0,N1),
  143   parse(1,1,N1,F1),
  144   example(E2,S2),
  145   retractall(chart(_,_,_,_,_)),
  146   initChart(S2,0,N2),
  147   parse(1,1,N2,F2),
  148   inference(not(imp(F1,F2))).
  149
  150
  151/* ----------------------------------------------------------------------------------
  152   Chart Init
  153---------------------------------------------------------------------------------- */
  154
  155initChart([],X,X).
  156
  157initChart([Token|L],X,N):-
  158   Y is X + 1,
  159   lex(Token,Cat,Sem),
  160   assert(chart(X,Y,Cat,Sem,lex(Cat,Token))),
  161   initChart(L,Y,N).
  162
  163/* ----------------------------------------------------------------------------------
  164   Parsing (CYK)
  165---------------------------------------------------------------------------------- */
  166
  167parse(Start,K,End,FOL):- 
  168   K > End, 
  169   chart(Start,End,Cat,Sem,Der), !,
  170 write(chart(Start,End,Cat,Sem,Der)),nl,
  171   output(Cat,Sem,Der,FOL).
  172
  173parse(M,K,L,F):-
  174   L is M+K, !,
  175   parse(M,L),
  176   KInc is K+1,
  177   parse(0,KInc,L,F).
  178
  179parse(M,K,L,F):-                    
  180   N is M+K,                      
  181   parse(M,N),
  182   MInc is M+1,
  183   parse(MInc,K,L,F).
  184
  185
  186/* ----------------------------------------------------------------------------------
  187   Output
  188---------------------------------------------------------------------------------- */
  189
  190output(Cat,Sem,Der,FOL):-
  191   write(cat:Cat),nl,
  192   write(sem:Sem),nl,
  193   reduce(Sem,Drs), !,
  194   printDrs(user_output,Drs),
  195   write(der:Der),nl,
  196   drs2fol(Drs,FOL),
  197   inference(FOL).
  198
  199/* ----------------------------------------------------------------------------------
  200   Combine
  201---------------------------------------------------------------------------------- */
  202
  203parse(M,L):-
  204   chart(M,X,Cat1,Sem1,Der1),
  205   chart(X,L,Cat2,Sem2,Der2),
  206   combine(Cat1:Sem1,Cat2:Sem2,Cat3:Sem3,Der1,Der2,Der3), !,
  207   assert(chart(M,L,Cat3,Sem3,Der3)).
  208
  209parse(_,_).
  210
  211
  212/* ----------------------------------------------------------------------------------
  213   Inference
  214---------------------------------------------------------------------------------- */
  215   
  216inference(FOL):-
  217   MaxDomSize=20,
  218
  219   A10  = all(X,all(Y,imp(member(X,Y),and(individual(X),collection(Y))))),
  220   A11  = all(B,imp(two(B),and(some(A,firstmember(A,B)),some(A,secondmember(A,B))))),
  221   A12  = all(B,imp(three(B),and(some(A,firstmember(A,B)),and(some(A,secondmember(A,B)),some(A,thirdmember(A,B)))))),
  222   A13  = all(B,imp(four(B),and(some(A,firstmember(A,B)),and(some(A,secondmember(A,B)),and(some(A,thirdmember(A,B)),some(A,fourthmember(A,B))))))),
  223
  224   A14  = all(X,all(Y,imp(firstmember(X,Y),member(X,Y)))),
  225   A15  = all(X,all(Y,imp(secondmember(X,Y),member(X,Y)))),
  226   A16  = all(X,all(Y,imp(thirdmember(X,Y),member(X,Y)))),
  227   A17  = all(X,all(Y,imp(fourthmember(X,Y),member(X,Y)))),
  228
  229%   A15  = all(X,imp(and(individual(X),some(Y,and(individual(Y),not(eq(X,Y))))),some(Y,and(two(Y),member(X,Y))))),
  230%   A15  = all(X,all(Y,imp(and(individual(X),and(individual(Y),not(eq(X,Y)))),some(Z,and(two(Z),and(member(X,Z),member(Y,Z))))))),
  231%   A16  = all(X,all(Y,imp(and(two(Y),member(X,Y)),or(firstmember(X,Y),secondmember(X,Y))))),
  232
  233%   A1 = and(A10,and(A11,and(A12,and(A13,and(A14,and(A15,and(A16,and(A17,and(A18,A19))))))))),
  234   A1 = and(A10,and(A11,and(A12,and(A13,and(A14,and(A15,and(A16,A17))))))),
  235
  236   A21  = all(X,imp(individual(X),not(collection(X)))),
  237   A22  = all(X,imp(individual(X),not(event(X)))),
  238   A23  = all(X,imp(collection(X),not(event(X)))),
  239   A24  = all(X,imp(man(X),not(woman(X)))),
  240   A25  = all(X,imp(man(X),human(X))),
  241   A26  = all(X,imp(woman(X),human(X))),
  242   A27  = all(X,imp(human(X),individual(X))),
  243   A28  = all(X,imp(smoke(X),event(X))),
  244   A29  = all(X,imp(see(X),event(X))),
  245   A2 = and(A21,and(A22,and(A23,and(A24,and(A25,and(A26,and(A27,and(A28,A29)))))))),
  246
  247   A31 = all(X,imp(two(X),collection(X))),
  248   A32 = all(X,imp(three(X),collection(X))),
  249   A33 = all(X,imp(four(X),collection(X))),
  250   A3 = and(A31,and(A32,A33)),
  251
  252   A40  = all(X,imp(two(X),not(some(Y,and(firstmember(Y,X),secondmember(Y,X)))))),
  253   A41  = all(X,imp(three(X),not(some(Y,and(firstmember(Y,X),thirdmember(Y,X)))))),
  254   A42  = all(X,imp(three(X),not(some(Y,and(secondmember(Y,X),thirdmember(Y,X)))))),
  255   A43  = all(X,imp(three(X),not(some(Y,and(firstmember(Y,X),secondmember(Y,X)))))),
  256   A44  = all(X,imp(four(X),not(some(Y,and(firstmember(Y,X),secondmember(Y,X)))))),   
  257   A45  = all(X,imp(four(X),not(some(Y,and(firstmember(Y,X),thirdmember(Y,X)))))),
  258   A46  = all(X,imp(four(X),not(some(Y,and(firstmember(Y,X),fourthmember(Y,X)))))),
  259   A47  = all(X,imp(four(X),not(some(Y,and(secondmember(Y,X),thirdmember(Y,X)))))),
  260   A48  = all(X,imp(four(X),not(some(Y,and(secondmember(Y,X),fourthmember(Y,X)))))),
  261   A49  = all(X,imp(four(X),not(some(Y,and(thirdmember(Y,X),fourthmember(Y,X)))))),
  262   A4 = and(A40,and(A41,and(A42,and(A43,and(A44,and(A45,and(A46,and(A47,and(A48,A49))))))))),
  263
  264   A51  = all(X,imp(lou(X),not(andy(X)))),
  265   A52  = all(X,imp(lou(X),man(X))),
  266   A53  = all(X,imp(andy(X),man(X))),
  267   A54  = all(X,imp(mia(X),woman(X))),
  268   A5 = and(A51,and(A52,and(A53,A54))),
  269
  270   A60  = all(X,imp(and(individual(X),some(Y,and(individual(Y),not(eq(Y,X))))),some(Y,and(two(Y),member(X,Y))))),
  271   A61  = all(X,imp(and(individual(X),some(Y,and(two(Y),not(member(X,Y))))),some(Y,and(three(Y),member(X,Y))))),
  272   A62  = all(X,imp(and(individual(X),some(Y,and(three(Y),not(member(X,Y))))),some(Y,and(four(Y),member(X,Y))))),
  273
  274   A63  = all(X,imp(two(X),all(Y,imp(member(Y,X),or(firstmember(Y,X),secondmember(Y,X)))))),
  275   A64  = all(X,imp(three(X),all(Y,imp(member(Y,X),or(firstmember(Y,X),or(secondmember(Y,X),thirdmember(Y,X))))))),
  276   A65  = all(X,imp(four(X),all(Y,imp(member(Y,X),or(firstmember(Y,X),or(secondmember(Y,X),or(thirdmember(Y,X),fourthmember(Y,X)))))))),
  277
  278   A66  = all(X,all(Y,imp(some(C,and(firstmember(X,C),firstmember(Y,C))),eq(X,Y)))),
  279   A67  = all(X,all(Y,imp(some(C,and(secondmember(X,C),secondmember(Y,C))),eq(X,Y)))),
  280   A68  = all(X,all(Y,imp(some(C,and(thirdmember(X,C),thirdmember(Y,C))),eq(X,Y)))),
  281   A69  = all(X,all(Y,imp(some(C,and(fourthmember(X,C),fourthmember(Y,C))),eq(X,Y)))),
  282
  283   A6 = and(A60,and(A61,and(A62,and(A63,and(A64,and(A65,and(A66,and(A67,and(A68,A69))))))))),
  284
  285   BK = and(A1,and(A2,and(A3,and(A4,and(A5,A6))))),
  286   F = and(BK,FOL),
  287   callTPandMB([],not(F),F,1,MaxDomSize,Model,Engine),
  288
  289   write(engine:Engine),nl,
  290   printModel(Model,user_output),nl.
  291
  292
  293/* ----------------------------------------------------------------------------------
  294   POS reduction
  295---------------------------------------------------------------------------------- */
  296
  297reduce(drs(D,Conds),Reduced):-
  298   select(pos(drs([],C1)),Conds,C2), !,
  299   append(C1,C2,C3),
  300   reduce(drs(D,C3),Reduced).
  301
  302reduce(drs(D,C1),drs(D,C2)):- !,
  303   reduce(C1,C2).
  304
  305reduce([],[]):- !.
  306
  307reduce([pos(B1)|L1],[pos(B2)|L2]):- !,
  308  reduce(B1,B2),
  309  reduce(L1,L2).
  310
  311reduce([imp(A1,B1)|L1],[imp(A2,B2)|L2]):- !,
  312  reduce(A1,A2),
  313  reduce(B1,B2),
  314  reduce(L1,L2).
  315
  316reduce([or(A1,B1)|L1],[or(A2,B2)|L2]):- !,
  317  reduce(A1,A2),
  318  reduce(B1,B2),
  319  reduce(L1,L2).
  320
  321reduce([C|L1],[C|L2]):- !,
  322  reduce(L1,L2).
  323
  324
  325/* ----------------------------------------------------------------------------------
  326   drs2fol
  327---------------------------------------------------------------------------------- */
  328
  329drs2fol(drs([],[Cond]),Formula):- !, cond2fol(Cond,Formula).
  330
  331drs2fol(drs([],[Cond1,Cond2|Conds]),and(Formula1,Formula2)):- !,
  332   cond2fol(Cond1,Formula1), drs2fol(drs([],[Cond2|Conds]),Formula2).
  333
  334drs2fol(drs([_:X|Referents],Conds),some(V,Formula)):-
  335   ref2var(X,V), 
  336   drs2fol(drs(Referents,Conds),Formula).
  337
  338
  339/* ========================================================================
  340   Referents to variable
  341=========================================================================*/
  342
  343ref2var(x1,'X'):- !.
  344ref2var(x2,'Y'):- !.
  345
  346
  347/* ========================================================================
  348   Translate DRS-Conditions into FOL formulas 
  349=========================================================================*/
  350
  351cond2fol(_:C,F):- !,
  352   cond2fol(C,F).
  353
  354cond2fol(not(Drs),not(Formula)):- !,
  355   drs2fol(Drs,Formula).
  356 
  357cond2fol(pos(Drs),Formula):- !,
  358   drs2fol(Drs,Formula).
  359
  360cond2fol(or(Drs1,Drs2),or(Formula1,Formula2)):- !,
  361   drs2fol(Drs1,Formula1),
  362   drs2fol(Drs2,Formula2).
  363
  364cond2fol(imp(drs(D,C),B),Formula):- !,
  365   cond2fol(not(drs(D,[not(B)|C])),Formula).
  366
  367cond2fol(named(X,N1,Type,Sense),F):-
  368   symbol(Type,N1,Sense,N2), !,
  369   ref2var(X,V),
  370   F=..[N2,V].
  371
  372cond2fol(eq(X,Y),eq(V1,V2)):- 
  373   ref2var(X,V1),
  374   ref2var(Y,V2).
  375
  376cond2fol(pred(X,Sym1,Type,Sense),F):- 
  377   symbol(Type,Sym1,Sense,Sym2), !,
  378   ref2var(X,V), F=..[Sym2,V].
  379
  380cond2fol(rel(X,Y,Sym1,Sense),F):- 
  381   symbol(r,Sym1,Sense,Sym2), !,
  382   ref2var(X,V1), ref2var(Y,V2),  F=..[Sym2,V1,V2].
  383
  384
  385/*========================================================================
  386   Ensure F is a number or atom
  387========================================================================*/
  388
  389symbol(Type,F1,0,F2):- !, symbol(Type,F1,1,F2).
  390symbol(_Type,F1,_Sense,F2):- F1=F2.
  391
  392
  393/* =======================================================================
  394   Print Model
  395========================================================================*/
  396
  397printModel(model(D,[]),Stream):- !,
  398   format(Stream,'model(~p, [])',[D]).
  399
  400printModel(model(D,[F]),Stream):- !,
  401   format(Stream,'model(~p,~n  [~p])',[D,F]).
  402
  403printModel(model(D,[X,Y|F]),Stream):- !,
  404   sort([X,Y|F],[First|Sorted]),
  405   format(Stream,'model(~p,~n  [~p,~n',[D,First]),
  406   printModel(Sorted,Stream).
  407
  408printModel([Last],Stream):- !,
  409   format(Stream,'   ~p])',[Last]).
  410
  411printModel([X|L],Stream):- !,
  412   format(Stream,'   ~p,~n',[X]),
  413   printModel(L,Stream).
  414
  415printModel(Model,Stream):-
  416   write(Stream,Model)