我想知道如何基于另一个列表中的现有原子在列表中生成新原子。鉴于名单:基于列表中的现有原子生成新原子
L=[a,b,c,d]
我想产生一个新的列表,例如:
P=[a_,b_,c_,d_]
换句话说类似于串另外的东西,例如
String str1 = str2 + "_";
我想知道如何基于另一个列表中的现有原子在列表中生成新原子。鉴于名单:基于列表中的现有原子生成新原子
L=[a,b,c,d]
我想产生一个新的列表,例如:
P=[a_,b_,c_,d_]
换句话说类似于串另外的东西,例如
String str1 = str2 + "_";
不知道,如果它在所有的Prolog系统可用,但concat_atom/2
会做的伎俩:
?- concat_atom([a,'_'], A).
A = a_.
的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_].
在SWI-Prolog的,使用'atomic_list_concat'('concat_atom'已过时)。 – Kaarel
'atom_concat/3'是ISO。 – false