% 翻訳システム例題 T.Inaba Sofnec.co.jp 1986.5.26
% 
% ?-consult('trans.dcg').
% ?-trans("time flies like an arrow",IMI,J).
% ?-trans("I like you",IMI,J).

/*

　　【翻訳システムの流れ】

  [入力文]        [出力文]
  　↓              ↑
  形態素解析      形態素合成
  　↓              ↑
  構文解析  ＝＞  構文生成　　　（同等構文に変換） このプログラムの処理
  　↓              ↑
  意味抽出   →   意味変換

        +-------------- 同等構文  --------------+   +-------→　翻訳文
       ↓                                       ↓ ↑
| ?-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,[]).                                      % 同一構文を持つ日本語生成 

