Здесь можно использовать встроенный 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