List 基于列表中的现有原子生成新原子
我想知道如何基于另一个列表中的现有原子在列表中生成新原子。给定列表:List 基于列表中的现有原子生成新原子,list,prolog,iso-prolog,List,Prolog,Iso Prolog,我想知道如何基于另一个列表中的现有原子在列表中生成新原子。给定列表: 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_con
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
与许多其他高阶谓词一样,在末尾添加额外的参数。在函数式编程语言中,这称为部分应用程序。但在我们的例子中,最好在前面加一个参数,在后面加一个参数。你可以自己定义,比如
suffix_prefix_concat(S,P,C) :-
atom_concat(P,S,C).
由于可以避免最后一个参数,与上面的suffix\u prefix\u concat
类似,我们可以更简洁地编写:
?- maplist(\P^atom_concat(P,'_'),[a,b,c,d],Xs).
Xs = [a_,b_,c_,d_].
?-映射列表(\P^atom_concat(P,'''u'),[a,b,c,d],Xs)。
Xs=[a,b,c,d]。
在SWI Prolog中,使用
atomic_list_concat
(concat_atom
不推荐使用)。
?- maplist(suffix_prefix_concat('_'),[a,b,c,d], Xs).
Xs = [a_,b_,c_,d_].
?- maplist(\P^C^atom_concat(P,'_',C),[a,b,c,d],Xs).
Xs = [a_,b_,c_,d_].
?- maplist(\P^atom_concat(P,'_'),[a,b,c,d],Xs).
Xs = [a_,b_,c_,d_].