2011-05-14 89 views
2

我有一个问题,谓语其中以这种方式工作,它需要的原子列表:序言:转换原子新的原子

nopolfont([to,jest,tekśćik,'!'],L). 

,并在结果

L = [to,jest,tekscik,'!']. 

我有问题make_swapswap谓词。到目前为止,我有:

k(ś,s). 
k(ą,a). 
% etc. 
swap(X,W) :- name(X,P), k(P,Y), !, name(Y,W). 
swap(X,X). 

make_swap(A,W) 
    :- atom(A),!, 
    name(A,L), 
    swap(L,NL), 
    name(W,NL). 

nopolfont([],[]). 
nopolfont([H|T],[NH|S]) :- make_swap(H,NH), nopolfont(T,S). 

是否有任何优雅的方式来做到这一点?

回答

1

这也很优雅:

polish_char_replacer(X, Y) :- 
    k(X, Y), 
    !. 
polish_char_replacer(X, X). 

nopolfont(Atoms1, Atoms2) :- 
    maplist(replace(polish_char_replacer), Atoms1, Atoms2). 

replace(Goal, Atom1, Atom2) :- 
    atom_chars(Atom1, Chars1), 
    maplist(Goal, Chars1, Chars2), 
    atom_chars(Atom2, Chars2). 
+0

的确,相当优雅:) – rAum 2011-05-27 10:47:29

0

大概优雅因为它可以得到:

k(ś,s). 
k(ą,a). 

swap(X,W) :- name(P,[X]), k(P,Y), !, name(Y,[W]). 
swap(X,X). 

list_swap([], []). 
list_swap([H|T], [W|S]) :- 
    swap(H, W), 
    list_swap(T, S). 

atom_swap(A,W) :- 
    atom(A), !, 
    name(A, L), 
    list_swap(L,S), 
    name(W, S). 

nopolfont([],[]). 
nopolfont([H|T],[NH|S]) :- 
    atom_swap(H,NH), 
    nopolfont(T,S). 

而且,显然定义了这一点,以获得期望的结果,但我认为这是在% etc

k(ć, c). 
+0

谢谢:)它的作品,辉煌。 – rAum 2011-05-14 18:32:50