%% Description: A grammar for the syntactic, semantic, and discourse parsing %% %% Writer: Minhaeng Lee %% %% °ü·Ã¼º: Á¦ 8 Àå %% %% Name: eilcp.pl %% %% ¿µ¾îÀÇ Åë»ç.Àǹ̺м®À» À§ÇÑ ÁÂÃøÄÚ³Ê Æļ­ %% Á¤º¸±¸Á¶·Î¼­ AVM ±¸Á¶¿Í ´ãÈ­Ç¥»ó±¸Á¶¸¦ Æ÷ÇÔÇÏ´Â ÅëÇÕÇÁ·Î±×·¥ %% Based on Left-Corner Parser of Pereira/Shieber (1987) :- consult('tree.pl'). :- consult('avm.pl'). :- op(500,xfy, : ). :- op(700,xfy, ===). :- op(1100,xfx,--->). :- op(950, xfy, to). :- op(930, yfx, lambda). :- op(920, xfy, &). :- op(920, yfx, =>). % ¿¬»êÀÚ°¡ ¿ø·¡ '>' ·Î Á¤ÀǵǾúÀ¸³ª, °¡µ¶¼ºÀ» ³ôÀ̱â À§ÇØ ¹Ù²Ù¾ú´Ù. :- op(920, xfy, <=>). :- op(800, fy, non). :- op(300,yfx,v). :- op(200,fy,~). /*===================================================================== Functional Application (FA) =====================================================================*/ fa(lambda2(Argument,Result),Argument,Result). /*===================================================================== DRS-merge =====================================================================*/ mergeDrs(drs(D,C1),drs(D,C2)):- mergeDrs(C1,C2). mergeDrs(merge(B1,B2),drs(D3,C3)):- mergeDrs(B1,drs(D1,C1)),mergeDrs(B2,drs(D2,C2)), append(D1,D2,D3),append(C1,C2,C3). mergeDrs([B1 => B2|C1],[B3 => B4|C2]):-!, mergeDrs(B1,B3),mergeDrs(B2,B4),mergeDrs(C1,C2). mergeDrs([B1 v B2|C1],[B3 v B4|C2]):-!, mergeDrs(B1,B3),mergeDrs(B2,B4),mergeDrs(C1,C2). mergeDrs([~ B1|C1],[~ B2|C2]):-!, mergeDrs(B1,B2),mergeDrs(C1,C2). mergeDrs([C|C1],[C|C2]):- mergeDrs(C1,C2). mergeDrs([],[]). % - DAGUNIFY - originally written by Bob Carpenter % unify two side-ways open DAGs, encoded as open-ended lists unify(Dag,Dag) :- !. unify([Path:Value|Dags1],Dag) :- pathval(Dag,Path,Value,Dags2), unify(Dags1,Dags2). pathval(Dag1,Feature:Path,Value,Dags) :- !, pathval(Dag1,Feature,Dag2,Dags), pathval(Dag2,Path,Value,_). pathval([Feature:Value1|Dags],Feature,Value2,Dags) :- !, unify(Value1,Value2). pathval([Dag|Dags1],Feature,Value,[Dag|Dags2]) :- pathval(Dags1,Feature,Value,Dags2). X === Y :- denotes(X,A), denotes(Y,B), unify(A,B). denotes(Var,Var) :- var(Var),!. denotes(Atom,Atom) :- atomic(Atom),!. denotes([H|R],[H|R]) :-!. denotes(Dag:Path,Value) :- pathval(Dag,Path,Value,_). synsem(Sentence) :- parse(SynSem,Sentence,[]), SynSem =.. [Cat,Core_syn,Core_sem,Core_fs,Core_drs], write('Category = '), write(Cat),nl, write('Syntactic Structure = '),nl,tab(10), write(Core_syn),nl,tree(Core_syn),nl, write('Semantic Representation = '),nl,tab(10), write(Core_sem),nl,nl, write('AVM Information Structure = '),nl,tab(10), write(Core_fs),nl,nl,avm(Core_fs),nl, write('Discourse Representation a la DRT = '),nl,nl,tab(10), write_drs(Core_drs),nl. write_drs(Core_drs) :- (mergeDrs(Core_drs,DRS),!,write(DRS));write(Core_drs),nl. parse(Phrase) --> leaf(SubPhrase), lc(SubPhrase,Phrase). leaf(Cat) --> [Word],{word(Word,Cat)}. leaf(Phrase) --> {Phrase ---> []}. lc(Phrase,Phrase) --> []. lc(SubPhrase,SuperPhrase) --> {Phrase ---> [SubPhrase|Rest]}, parse_rest(Rest), lc(Phrase,SuperPhrase). parse_rest([]) --> []. parse_rest([Phrase|Phrases]) --> parse(Phrase), parse_rest(Phrases). % English Grammar s(s(NPcs,VPcs),S,Sfs,Sdr) ---> [np(NPcs,VP to S,NPfs,NPdr), vp(VPcs,VP,VPfs,VPdr)] :- (Sfs:head === VPfs, Sfs:subj === NPfs),fa(NPdr,VPdr,Sdr). np(np(DETcs,Ncs),NP,NPfs,NPdr) ---> [det(DETcs,N1 to NP,DETfs,DETdr), n(Ncs,N1,Nfs,Ndr)] :- (NPfs:head === Nfs, NPfs:specifier === DETfs),fa(DETdr,Ndr,NPdr). np(np(PNcs),(S lambda E) to S,NPfs,PNdr) ---> [pn(PNcs,E,PNfs,PNdr)] :- (NPfs:head === PNfs). vp(vp(TVcs,NPcs),IV lambda X,VPfs,VPdr) ---> [tv(TVcs,TV lambda X,TVfs,TVdr), np(NPcs,TV to IV,NPfs,NPdr)] :- (VPfs:head === TVfs, VPfs:complement === NPfs),fa(TVdr,NPdr,VPdr). vp(vp(TVcs,NPcs,ADVcs),ADVS lambda X,VPfs) ---> [tv(TVcs,TV lambda X,TVfs), np(NPcs,TV to IV,NPfs), adv(ADVcs,ADVS lambda IV to ADVS,ADVfs)] :- (VPfs:head === TVfs, VPfs:complement === NPfs, VPfs:adjunct === ADVfs). vp(vp(IVcs),IV,VPfs,IVdr) ---> [iv(IVcs,IV,IVfs,IVdr)] :- (VPfs:head === IVfs). % English Lexicon word(every, det(det(every),(P lambda X) to (Q lambda X) to forall(X, P => Q),Fd,lambda2(P2,lambda2(Q2,drs([],[drs([X2|D],C) => B]))) )) :- (Fd:phon === every, Fd:cat === det, Fd:semfunc === for_all),fa(P2,X2,drs(D,C)),fa(Q2,X2,B). word(a,det(det(a),(P lambda X) to (Q lambda X) to exists(X, P & Q),Fd,lambda2(P2,lambda2(Q2,merge(drs([X2|D],C),B))) )) :- (Fd:phon === a, Fd:cat === det, Fd:semfunc === for_some),fa(P2,X2,drs(D,C)),fa(Q2,X2,B). word( program, n(n(program), program(X) lambda X, Fn,lambda2(X2,drs([],[program(X2)])) )) :- (Fn:phon === program, Fn:cat === noun). word( student, n(n(student),student(X) lambda X, Fn,lambda2(X2,drs([],[student(X2)])) )) :- (Fn:phon === student, Fn:cat === noun). word( book, n(n(book),book(X) lambda X, Fn,lambda2(X2,drs([],[book(X2)])) )) :- (Fn:phon === book, Fn:cat === noun). word( professor, n(n(professor),professor(X) lambda X, Fn,lambda2(X2,drs([],[professor(X2)])) )) :- (Fn:phon === professor, Fn:cat === noun). word( city, n(n(city),city(X) lambda X, Fn,lambda2(X2,drs([],[city(X2)])) )) :- (Fn:phon === city, Fn:cat === noun). word(terry, pn(pn(terry),terry,Fpn,lambda2(P,merge(drs([X],[X=terry]),B)) )) :- (Fpn:phon === terry, Fpn:cat === proper_noun,Fpn:gend === masc),fa(P,X,B). word(shrdlu, pn(pn(shrdlu),shrdlu, Fpn,lambda2(P,merge(drs([X],[X=shrdlu]),B)) )) :- (Fpn:phon === shrdlu,Fpn:cat === proper_noun,Fpn:gend === neut),fa(P,X,B). word(mimi, pn(pn(mimi),mimi,Fpn,lambda2(P,merge(drs([X],[X=mimi]),B)))) :- (Fpn:phon === mimi, Fpn:cat === proper_noun,Fpn:gend === fem),fa(P,X,B). word(sharon_stone, pn(pn(sharon_stone),sharon_stone,Fpn,lambda2(P,merge(drs([X],[X=sharon_stone]),B)) )) :- (Fpn:phon === sharon_stone, Fpn:cat === proper_noun,Fpn:gend === fem),fa(P,X,B). word(wrote, tv(tv(wrote),(wrote(X,Y) lambda Y) lambda X,Fv,lambda2(K,lambda2(Y2,B)) )) :- (Fv:phon === wrote, Fv:cat === verb, Fv:tense === past),fa(K,lambda2(X2,drs([],[wrote(Y2,X2)])),B). word(loved, tv(tv(loved),(loved(X,Y) lambda Y) lambda X,Fv,lambda2(K,lambda2(Y2,B)) )) :- (Fv:phon === loved, Fv:cat === verb, Fv:tense === past),fa(K,lambda2(X2,drs([],[loved(Y2,X2)])),B). word(ran, iv(iv(ran),(ran(X,Y) lambda Y) lambda X,Fv,lambda2(X2,drs([],[ran(X2)])) )) :- (Fv:phon === ran, Fv:cat === verb, Fv:tense === past). word(halts, iv(iv(halts),halts(X) lambda X,Fv,lambda2(X2,drs([],[halts(X2)])) )) :- (Fv:phon === halts, Fv:cat === verb, Fv:tense === present). word(runs, iv(iv(runs),runs(X) lambda X,Fv,lambda2(X2,drs([],[runs(X2)])) )) :- (Fv:phon === runs, Fv:cat === verb, Fv:tense === present). word(disappeared, iv(iv(disappeared),disappeared(X) lambda X,Fv,lambda2(X2,drs([],[disappeared(X2)])) )) :- (Fv:phon === disappeared, Fv:cat === verb, Fv:tense === past). % Test % to test % ?- test5. test1 :- synsem([terry,runs]). test2 :- synsem([a,program,halts]). test3 :- synsem([every,program,ran]). test4 :- synsem([terry,loved,sharon_stone]). test5 :- synsem([mimi,wrote,a,program]). test6 :- synsem([mimi,wrote,every,program]). test7 :- synsem([every,student,wrote,a,program]).