このページでは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,[]). % 同一構文を持つ日本語生成