将谓词应用于列表元素的Prolog映射过程

如何编写将谓词PredName(Arg,Res)应用于List的元素的Prolog过程映射(List,PredName,Result),并返回列表Result中的结果?

例如:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
最佳答案
这通常被称为maplist / 3并且是Prolog prologue的一部分。注意不同的参数顺序!

:- meta_predicate maplist(2, ?, ?).

maplist(_C_2, [], []).
maplist( C_2, [X|Xs], [Y|Ys]) :-
   call(C_2, X, Y),
   maplist( C_2, Xs, Ys).

不同的参数顺序允许您轻松嵌套几个maplist-goal。

?- maplist(maplist(test),[[1,2],[3,4]],Rss).
Rss = [[1,4],[9,16]].

maplist具有不同的字体,对应于the following constructs in functional languages,但要求所有列表具有相同的长度。注意,Prolog没有zip / zipWith和unzip之间的不对称。目标地图列表(C_3,Xs,Ys,Zs)包含,甚至提供更一般的用途。

> maplist / 2对应于all
> maplist / 3对应于map
> maplist / 4对应于zipWith,但也解压缩
> maplist / 5对应于zipWith3和unzip3
> …

转载注明原文:将谓词应用于列表元素的Prolog映射过程 - 代码日志