| ?-consult('trans.dcg').
yes
| ?-trans("time flies like an arrow",IMI,J).
IMI = [s,[np,[n,time],[np,[n,flies]]],[vp,[vt,like],[np,[det,a],[n,arrow]]]],
J = [時,の,蝿,は,ひとつの,矢,を,好む]
yes
| ?-trans("I like you",IMI,J).
IMI = [s,[np,[n,I]],[vp,[vt,like],[np,[n,you]]]],
J = [私,は,あなた,を,好む]
yes
| ?-listing.
s([s,Np,Vp],_2,_3) :-
np(Np,_2,_4),
vp(Vp,_4,_3).
s([s,Vp],_1,_2) :-
vp(Vp,_1,_2).
np([np,N,Np],_2,_3) :-
n(N,_2,_4),
np(Np,_4,_3).
np([np,Det,Noun],_2,_3) :-
det(Det,_2,_4),
n(Noun,_4,_3).
np([np,Noun],_1,_2) :-
n(Noun,_1,_2).
vp([vp,Vi],_1,_2) :-
vi(Vi,_1,_2).
vp([vp,Vi,PP],_2,_3) :-
vi(Vi,_2,_4),
pp(PP,_4,_3).
vp([vp,Vt,Np],_2,_3) :-
vt(Vt,_2,_4),
np(Np,_4,_3).
vp([vp,Vt,Np,PP],_3,_4) :-
vt(Vt,_3,_5),
np(Np,_5,_6),
pp(PP,_6,_4).
n([n,'I'],['I'|_0],_0).
n([n,you],[you|_0],_0).
n([n,arrow],[arrow|_0],_0).
n([n,flies],[flies|_0],_0).
n([n,time],[time|_0],_0).
n([n,like],[like|_0],_0).
det([det,a],[an|_0],_0).
vi([vi,flies],[flies|_0],_0).
vi([vi,like],[like|_0],_0).
pp([pp,P,Np],_2,_3) :-
p(P,_2,_4),
np(Np,_4,_3).
vt([vt,time],[time|_0],_0).
vt([vt,like],[like|_0],_0).
p([p,like],[like|_0],_0).
js([s,Np,Vp],_2,_3) :-
jnp(Np,_2,[は|_4]),
jvp(Vp,_4,_3).
js([s,Vp],_1,_2) :-
jvp(Vp,_1,_2).
jnp([np,N,Np],_2,_3) :-
jn(N,_2,[の|_4]),
jnp(Np,_4,_3).
jnp([np,Det,Noun],_2,_3) :-
jdet(Det,_2,_4),
jn(Noun,_4,_3).
jnp([np,Noun],_1,_2) :-
jn(Noun,_1,_2).
jvp([vp,Vi],_1,_2) :-
jvi(Vi,_1,_2).
jvp([vp,Vi,PP],_2,_3) :-
jpp(PP,_2,_4),
jvi(Vi,_4,_3).
jvp([vp,Vt,Np],_2,_3) :-
jnp(Np,_2,[を|_4]),
jvt(Vt,_4,_3).
jvp([vp,Vt,Np,PP],_3,_4) :-
jnp(Np,_3,[を|_5]),
jpp(PP,_5,_6),
jvt(Vt,_6,_4).
jn([n,'I'],[私|_0],_0).
jn([n,you],[あなた|_0],_0).
jn([n,arrow],[矢|_0],_0).
jn([n,flies],[蝿|_0],_0).
jn([n,flies],[てんぷら|_0],_0).
jn([n,time],[時|_0],_0).
jn([n,like],[好み|_0],_0).
jdet([det,a],[ひとつの|_0],_0).
jvi([vi,like],[好む|_0],_0).
jvi([vi,flies],[飛ぶ|_0],_0).
jvi([vi,flies],[揚がる|_0],_0).
jpp([pp,P,Np],_2,_3) :-
jnp(Np,_2,_4),
jp(P,_4,_3).
jvt([vt,time],[計る|_0],_0).
jvt([vt,like],[好む|_0],_0).
jvt([vt,flies],[揚げる|_0],_0).
jp([p,like],[のように|_0],_0).
trans(Bun,IMI,J) :-
bagof(A,L^(rexpl(Bun,'[^ ^\.]+',L),name(A,L)),E),
s(IMI,E,[]),
js(IMI,J,[]).
yes
|
% 翻訳プログラム例題 T.Inaba Sofnec.co.jp
/*
【翻訳システムの流れ】
[入力文] [出力文]
↓ ↑
形態素解析 形態素合成
↓ ↑
構文解析 => 構文生成 (同等構文に変換) このプログラムの処理
↓ ↑
意味抽出 → 意味変換
+-------------- 同等構文 --------------+ +-------→ 翻訳文
↓ ↓ ↑
| ?-js(X,[時,の,蝿,は,ひとつの,矢,を,好む],[]),s(X,Y,[]).
X = [s,[np,[n,time],[np,[n,flies]]],[vp,[vt,like],[np,[det,a],[n,arrow]]]],
Y = [time,flies,like,an,arrow]
*/
%%%%%%%%%%%%%%%%%%%%%%%%
%% 英語構文規則、辞書 %%
% 通常文
s([s,Np,Vp]) --> np(Np),vp(Vp).
% 命令文
s([s,Vp]) --> vp(Vp).
% 名詞句
np([np,N,Np]) --> n(N),np(Np).
np([np,Det,Noun]) --> det(Det),n(Noun).
np([np,Noun]) --> n(Noun).
% 動詞句
vp([vp,Vi]) --> vi(Vi).
vp([vp,Vi,PP]) --> vi(Vi),pp(PP).
vp([vp,Vt,Np]) --> vt(Vt),np(Np).
vp([vp,Vt,Np,PP]) --> vt(Vt),np(Np),pp(PP).
% 前置詞句
pp([pp,P,Np]) --> p(P),np(Np).
% 終端節
n([n,'I']) --> ['I'].
n([n,you]) --> [you].
n([n,arrow]) --> [arrow].
n([n,flies]) --> [flies].
n([n,time]) --> [time].
n([n,like]) --> [like].
det([det,a]) --> [an].
p([p,like]) --> [like].
% 動詞
vt([vt,time]) --> [time].
vi([vi,flies]) --> [flies].
vt([vt,like]) --> [like].
vi([vi,like]) --> [like].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 日本語構文規則、辞書 %% %% <<注意>> %% %% 英語の文法規則、単語を意味表現としている %%
% 通常文
js([s,Np,Vp]) --> jnp(Np),[は],jvp(Vp).
% 命令文
js([s,Vp]) --> jvp(Vp).
% 名詞句
jnp([np,N,Np]) -->jn(N),[の],jnp(Np).
jnp([np,Det,Noun]) -->jdet(Det),jn(Noun).
jnp([np,Noun]) -->jn(Noun).
% 動詞句
jvp([vp,Vi]) -->jvi(Vi).
jvp([vp,Vi,PP]) -->jpp(PP),jvi(Vi).
jvp([vp,Vt,Np]) --> jnp(Np),[を],jvt(Vt).
jvp([vp,Vt,Np,PP]) --> jnp(Np),[を],jpp(PP),jvt(Vt).
% 前置詞句
jpp([pp,P,Np]) --> jnp(Np),jp(P).
% 終端節
jn([n,'I']) --> [私].
jn([n,you]) --> [あなた].
jn([n,arrow]) --> [矢].
jn([n,flies]) --> [蝿].
jn([n,flies]) --> [てんぷら].
jn([n,time]) --> [時].
jn([n,like]) --> [好み].
jdet([det,a]) -->[ひとつの].
jp([p,like]) -->[のように].
% 動詞
jvt([vt,time]) -->[計る].
jvt([vt,like]) -->[好む].
jvi([vi,like]) -->[好む].
jvt([vt,flies]) -->[揚げる].
jvi([vi,flies]) -->[飛ぶ].
jvi([vi,flies]) -->[揚がる].
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% 翻訳プログラム %%%%%
trans(Bun,IMI,J):-
bagof(A,L^(rexpl(Bun,'[^ ^\.]+',L),name(A,L)),E), % 文字列をアトム並びへ変換
s(IMI,E,[]), % 英語の構文解析
js(IMI,J,[]). % 同一構文を持つ日本語生成
|