Пролог: преобразование атома в новый атом - PullRequest
2 голосов
/ 14 мая 2011

У меня проблема с предикатом, который работает таким образом, что он принимает список атомов:

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),
     swap(L,NL),
     name(W,NL).

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

Есть ли какой-нибудь элегантный способ сделать это?

Ответы [ 2 ]

1 голос
/ 15 мая 2011

Это тоже довольно элегантно:

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 голосов
/ 14 мая 2011

Вероятно, настолько элегантно, насколько это возможно:

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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...