基于列表中的现有原子生成新原子

时间:2012-06-22 12:52:37

标签: list prolog iso-prolog

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

L=[a,b,c,d]

我想制作一个新列表,例如:

P=[a_,b_,c_,d_]

换句话说,类似于字符串添加,例如

String str1 = str2 + "_";

2 个答案:

答案 0 :(得分: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_].

答案 1 :(得分:1)

不知道它是否适用于所有Prolog系统,但concat_atom/2可以解决这个问题:

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