Prolog 序言:将原子转换为新原子

Prolog 序言:将原子转换为新原子,prolog,Prolog,我对谓词有一个问题,它以原子列表的方式工作: nopolfont([to,jest,tekśćik,'!'],L). 结果 L = [to,jest,tekscik,'!']. 我对make_swap和swap谓词有问题。到目前为止,我已经: 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)

我对谓词有一个问题,它以原子列表的方式工作:

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).

有什么优雅的方法可以做到这一点吗?

可能是最优雅的:

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).

这也相当优雅:

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).