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

L=[a,b,c,d]

我想生成一个新列表,例如:
P=[a_,b_,c_,d_]

换句话说,类似于字符串加法,例如
String str1 = str2 + "_";

最佳答案

ISO 内置的 atom_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 下载它。请参阅链接 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_]。

关于list - 基于列表中的现有原子生成新原子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11156556/

10-14 18:11