ИСО встроенный 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. См. Ссылку for a generic ISO definition, которая работает в любой системе соответствия 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_].
В SWI-Prolog, используйте 'atomic_list_concat' (' concat_atom' осуждается). – Kaarel
'atom_concat/3' - это ISO. – false