2012-06-22 35 views
3

我想知道如何基于另一个列表中的现有原子在列表中生成新原子。鉴于名单:基于列表中的现有原子生成新原子

L=[a,b,c,d] 

我想产生一个新的列表,例如:

P=[a_,b_,c_,d_] 

换句话说类似于串另外的东西,例如

String str1 = str2 + "_"; 

回答

1

不知道,如果它在所有的Prolog系统可用,但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

的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_]. 

...它有自己的缺点:发明一种新的定义通常是非常麻烦:想起来了,你必须找出一个单一用途的新名称! 对此的一个通用解决方案是预先安装在YAP中的library(lambda),您也可以将其下载到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_].