このページではJavaScriptを使用しています。

サンプルコード

trans.dcg 簡単な日英翻訳プログラム

デモ
http://www.sofnec.co.jp/az-demo/cgi-bin/otameshi.cgi
実行例

| ?-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

プログラム  trans.dcg
% 翻訳プログラム例題 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,[]). % 同一構文を持つ日本語生成