3

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

L=[a,b,c,d]

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

P=[a_,b_,c_,d_]

换句话说,类似于字符串加法的东西,例如

String str1 = str2 + "_";
4

2 回答 2

5

内置的 ISOatom_concat/3是在这里使用的:

?- atom_concat(a,'_',A)。
A = a_。

但是现在如何映射整个列表元素呢?maplist/3服务于这个目的,

?- maplist(atom_concat('_'), [a,b,c,d], Xs)。% 错误的!
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 标准的系统(如 GNU、B、SICStus)的通用 ISO 定义的链接。

?- 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_]。
于 2012-06-22T21:46:28.000 回答
1

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

?- concat_atom([a,'_'], A).
A = a_.
于 2012-06-22T13:14:28.903 回答