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

Rog*_*ger 3 list prolog iso-prolog

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

L=[a,b,c,d]
Run Code Online (Sandbox Code Playgroud)

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

P=[a_,b_,c_,d_]
Run Code Online (Sandbox Code Playgroud)

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

String str1 = str2 + "_";
Run Code Online (Sandbox Code Playgroud)

fal*_*lse 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_].

......它有它自己的缺点:发明一个新的定义通常非常麻烦:想想看,你必须为一次使用找出一个新的名字!对此的一般解决方案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_].