Создание нового атома на основе существующего атома в списке

Я хотел бы знать, как создать новый атом в списке на основе существующего атома в другом списке. Дан список:

L=[a,b,c,d]

Я хотел бы создать новый список, например:

P=[a_,b_,c_,d_]

Другими словами, что-то похожее на добавление строки, например.

String str1 = str2 + "_";

person Roger    schedule 22.06.2012    source источник


Ответы (2)


Здесь можно использовать встроенный ISO atom_concat/3:

?- atom_concat(a,'_',A).
A = a_.

Но как теперь отобразить весь список по элементам? maplist/3 служит этой цели,

?- maplist(atom_concat('_'), [a,b,c,d], Xs). % Wrong!
Xs = ['_a','_b','_c','_d'].

... или почти. Мы добавили подчеркивание впереди! maplist/3, как и многие другие предикаты более высокого порядка, добавляет дополнительные аргументы в конце. В функциональных языках программирования это называется частичным приложением. Но в нашем случае было бы неплохо добавить один аргумент впереди и один в конце. Вы можете дать собственное определение, например

suffix_prefix_concat(S,P,C) :-
   atom_concat(P,S,C).

в то время как это работает хорошо,

?- maplist(suffix_prefix_concat('_'),[a,b,c,d], Xs).
Xs = [a_,b_,c_,d_].

... у него есть свои недостатки: Изобретение нового определения часто очень громоздко: подумайте об этом, вам нужно придумать новое имя для одноразового использования! Общим решением для этого является library(lambda), который предустановлен в YAP, вы также можете скачать его для SWI. См. ссылку для общего определения ISO, которое работает в любой системе, соответствующей ISO, такой как GNU, B, SICStus.

?- maplist(\P^C^atom_concat(P,'_',C),[a,b,c,d],Xs).
Xs = [a_,b_,c_,d_].

А так как последнего аргумента можно избежать, аналогично suffix_prefix_concat выше, то можно записать более компактно:

?- maplist(\P^atom_concat(P,'_'),[a,b,c,d],Xs).
Xs = [a_,b_,c_,d_].
person false    schedule 22.06.2012

Не знаю, доступен ли он во всех системах Prolog, но concat_atom/2 поможет:

?- concat_atom([a,'_'], A).
A = a_.
person twinterer    schedule 22.06.2012
comment
В SWI-Prolog используйте atomic_list_concat (concat_atom устарело). - person Kaarel; 22.06.2012