%% Description: An English Grammar for Feature Structure Grammar %% %% Writer: Minhaeng Lee %% %% °ü·Ã¼º: Á¦ 4 Àå %% %% Name: eng_fsg.pl %% % - DAGUNIFY - originally written by Bob Carpenter % and taken from Gazdar/Mellish (1987) :- op(500,xfy, : ). :- op(700,xfy, ===). % 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,_). % English Grammar & Lexicon smax(smax(S,mood(M)),Fsmax) --> s(S,Fs), mood(M,Fmood), {Fsmax === Fs, Fsmax:mood === Fmood}. s(s(KP,T),Fs) --> kp(KP,ag,Fcp), tp(T,Ftp), {Fs === Ftp, Fs:subc:first === Fcp}. kp(kp(DP,case(CASE)),CASE,Fkp) --> dp(DP,CASE,Fdp), {Fkp === Fdp}. dp(dp(D),CASE,Fdp) --> d0(D,CASE,Fd), {Fdp === Fd}. dp(dp(Det,N),CASE,Fdp) --> det(DET,CASE,Fdet), cn(N,Fcn), {Fdp === Fdet, Fdp:comp === Fcn}. dp(dp(Det,Nbar),CASE,Fdp) --> det(DET,CASE,Fdet), nbar(Nbar,Fnbar), {Fdp === Fdet, Fdp:comp === Fnbar}. nbar(nbar(N,PP),Fnbar) --> cn(N,Fcn), pp(PP,Fpp), {Fnbar === Fcn, Fnbar:adjunct === Fpp}. pp(pp(P,DP),Fpp) --> p(P,Fp), dp(DP,Fdp), {Fpp === Fp, Fpp:comp === Fdp}. tp(tp(VP,tense(T)),Ftp) --> vp(VP,T,Fvp), {Ftp === Fvp}. vp(vp(V),T,Fvp) --> v1(V,T,Fv), {Fvp === Fv}. vp(vp(DP,V),T,Fvp) --> v2(V,T,Fv), kp(DP,pa,Fdp), {Fvp === Fv, Fvp:subc:second === Fdp}. vp(vp(DP1,DP2,V),T,Fvp) --> v3(V,T,Fv), kp(DP1,ben,Fdp1),kp(DP2,pa,Fdp2), {Fvp === Fv, Fvp:subc:second === Fdp1, Fvp:subc:third === Fdp2}. vp(vp(S,V),T,Fvp) --> vc(V,T,Fv), sc(S,Fs), {Fvp === Fv, Fvp:subc:second === Fs}. sc(S,Fsc) --> smax(S,Fs), {Fsc === Fs}. % Lexicon mood(decl,Fmood) --> ['.'], {Fmood:phon === '.', Fmood:cat === mood}. conj(conj(that),Fc) --> [that], {Fc:phon === that, Fc:cat === conj}. vc(v(believe_),pres,Fv) --> [believes], {Fv:phon === believes, Fv:cat === v, Fv:subc:first:agr:num === sg, Fv:subc:first:agr:per === 3}. vc(v(believe_),pres,Fv) --> [believe], {Fv:phon === believe, Fv:cat === v, Fv:subc:first:agr:num === pl, Fv:subc:first:agr:per === 3}. vc(v(believe_),past,Fv) --> [believed], {Fv:phon === believed, Fv:cat === v, Fv:subc:first:agr:num === NUM, Fv:subc:first:agr:per === PER}. v1(v(sleep_),pres,Fv) --> [sleeps], {Fv:phon === sleeps, Fv:cat === v, Fv:subc:first:agr:num === sg, Fv:subc:first:agr:per === 3, Fv:subc:second === end}. v1(v(sleep_),pres,Fv) --> [sleep], {Fv:phon === sleep, Fv:cat === v, Fv:subc:first:agr:num === sg, Fv:subc:first:agr:per === 1, Fv:subc:second === end}. v2(v(love_),pres,Fv) --> [loves], {Fv:phon === loves, Fv:cat === v, Fv:subc:first:agr:num === sg, Fv:subc:first:agr:per === 3, Fv:subc:first:case === nom, Fv:subc:second:case === acc}. v2(v(love_),past,Fv) --> [loved], {Fv:phon === loved, Fv:cat === v, Fv:subc:first:agr:num === sg, Fv:subc:first:agr:per === 3, Fv:subc:first:case === nom, Fv:subc:second:case === acc}. v3(v(present_),pres,Fv) --> [presents], {Fv:phon === presents, Fv:cat === v, Fv:subc:first:agr:num === sg, Fv:subc:first:agr:per === 3, Fv:subc:first:case === nom, Fv:subc:second:case === dat, Fv:subc:third:case === acc }. d0(d(peter),ag,Fd) --> [peter], {Fd:phon === peter, Fd:cat === det, Fd:agr:per === 3, Fd:agr:num === sg, Fd:case === nom}. d0(d(they),ag,Fd) --> [they], {Fd:phon === they, Fd:cat === pronoun, Fd:agr:per === 3, Fd:agr:num === pl, Fd:case === nom}. d0(d(susi),ben,Fd) --> [susi], {Fd:phon === susi, Fd:cat === det, Fd:case === dat}. d0(d(susi),pa,Fd) --> [susi], {Fd:phon === susi, Fd:cat === det, Fd:case === acc}. d0(d(he),ag,Fd) --> [he], {Fd:phon === he, Fd:cat === pronoun, Fd:case === nom}. d0(d(him),pa,Fd) --> [him], {Fd:phon === him, Fd:cat === pronoun, Fd:case === acc}. cn(n(woman),Fcn) --> [woman], {Fcn:phon === woman, Fcn:cat === n, Fcn:gend === fem}. cn(n(child),Fcn) --> [child], {Fcn:phon === child, Fcn:cat === n, Fcn:gend === masc}. det(det(a),_,Fdet) --> [a], {Fdet:phon === a, Fdet:ref === indef, Fdet:cat === det }. det(det(the),_,Fdet) --> [the], {Fdet:phon === the, Fdet:ref === def, Fdet:cat === det }. p(p(about),Fp) --> [about], {Fdet:phon === about, Fp:cat === p, Fp:comp:case === acc }. p(p(from),Fp) --> [from], {Fp:phon === from, Fp:cat === p, Fp:comp:case === acc }. /* Examples */ test1 :- smax(CSsmax,FSsmax,[a,woman,sleeps,.],[]), ,tree_pas(CSsmax), fstr_dmp(FSsmax). test2 :- smax(CSsmax,FSsmax,[a,woman,loves,susi,.],[]). ,tree_pas(CSsmax), fstr_dmp(FSsmax). test3 :- smax(CSsmax,FSsmax,[a,woman,presents,susi,a,book,.],[]). ,tree_pas(CSsmax), fstr_dmp(FSsmax). test4 :- smax(CSsmax,FSsmax,[peter,love,susi,.],[]). test5 :- smax(CSsmax,FSsmax,[a,man,loves,she,.],[]). %% Tree Representation for Predicate-Argument-Structure tree_pas(X) :- pp(X,3). pp(X,I) :- atomic(X), I1 is I - 1, tab(I), write(\), ltab(2), write(X), nl,!. pp(X,I) :- not(atomic(X)), X =.. [F|A], tab(I), write(\), ltab(2), write(F), atomic_length(F,N), I1 is I+N+3, nl, ppx(A,I1). ppx([],_). ppx([H|T],I) :- pp(H,I),ppx(T,I). ltab(0) :- !. ltab(N) :- put(45), M is N - 1, ltab(M). atomic_length(A,N) :- name(A,List), length(List,N). %% Tree Representation of Feature-Structures %% %% Writer: SeongMook Kim (1988) %% fstr_dmp(F) :- fstr_dump(F,[]),!. fstr_dump(F,_) :- var(F). fstr_dump([Func:Val|FT],Bar) :- !, bar_dmp(Bar), write('I --->'), write(Func), ( is_fstructure(Val),!, next_level_bar(FT,Bar,Bar2), nl, fstr_dump(Val,Bar2) ; write(':'), write(Val),nl ), fstr_dump(FT,Bar). is_fstructure([_:_|_]). next_level_bar(F,Bar,[none|Bar]) :- var(F),!. next_level_bar(_,Bar,[exist|Bar]). bar_dmp([]). bar_dmp([none|Bar]) :- bar_dmp(Bar),write(' '). bar_dmp([exist|Bar]) :- bar_dmp(Bar),write('I ').