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)
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_].