Mat*_*hee 5 nlp prolog machine-translation dcg
我需要找到一种方法将一个解析树转移到另一个不同顺序的树.它适用于具有SVO和SOV架构的两种语言的机器翻译项目.
t1 = s(np(n(he)), vp( v(went), np(n(home))))
Run Code Online (Sandbox Code Playgroud)
我想要它
t2 = s(np(n(he)), vp( np(n(home)), v(went)))
Run Code Online (Sandbox Code Playgroud)
根据表示t1的规则表示SVO语言,t2表示SOV语言体系结构.
规则集应适用于具有形容词和副词的复杂句子.
t1 = s(np(n(he)), vp( v(went), np(adj(his), n(home))))
t2 = s(np(n(he)), vp( np(adj(his), n(home)), v(went)))
Run Code Online (Sandbox Code Playgroud)
任何评论都会有用
谢谢Mathee
更简单的方法是通过模式匹配声明要完成的任何转换,以及在任何模式上递归工作的通用规则:
% specialize for VP
transfer(vp(X,Y), vp(V,U)) :- !,
transfer(X,U), transfer(Y,V).
% generic rule, work out arguments
transfer(X, Y) :-
X =.. [F|Xs],
maplist(transfer, Xs, Ys),
Y =.. [F|Ys].
Run Code Online (Sandbox Code Playgroud)
如果您需要程序能够双向工作,请检查通用规则中的变量实例化
transfer(X, Y) :-
nonvar(X), !, X =.. [F|Xs],
maplist(transfer, Xs, Ys),
Y =.. [F|Ys].
transfer(X, Y) :-
Y =.. [F|Ys],
maplist(transfer, Xs, Ys),
X =.. [F|Xs].
Run Code Online (Sandbox Code Playgroud)
产量(例如)
?- transfer(s(np(n(he)), vp( v(went), np(adj(his), n(home)))),T2).
T2 = s(np(n(he)), vp(np(adj(his), n(home)), v(went))).
?- transfer(T1,$T2).
T1 = s(np(n(he)), vp(v(went), np(adj(his), n(home)))).
Run Code Online (Sandbox Code Playgroud)