2012-06-22 2 views
3

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

L=[a,b,c,d] 

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

P=[a_,b_,c_,d_] 

Другими словами нечто похожее на струнной того, например,

String str1 = str2 + "_"; 

ответ

1

Не знаю, если он доступен во всех системах Пролога, но concat_atom/2 будет делать трюк:

?- concat_atom([a,'_'], A). 
A = a_. 
+0

В SWI-Prolog, используйте 'atomic_list_concat' (' concat_atom' осуждается). – Kaarel

+1

'atom_concat/3' - это ISO. – false

5

ИСО встроенный 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_]. 
Смежные вопросы