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

时间:2011-07-13 17:23:36

标签: prolog map-function meta-predicate

如何编写将谓词map(List, PredName, Result)应用于PredName(Arg, Res)元素的Prolog程序List,并将结果返回到列表Result

例如:

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

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no

1 个答案:

答案 0 :(得分:41)

这通常称为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 - 目标。

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

maplist来自不同的arities,对应the following constructs in functional languages,但要求所有列表的长度相同。请注意,Prolog不具有zip / zipWithunzip之间的不对称性。目标maplist(C_3, Xs, Ys, Zs)包含两者,甚至提供更多的一般用途。

  • maplist/2对应all
  • maplist/3对应map
  • maplist/4对应zipWith,但unzip
  • maplist/5对应zipWith3unzip3
  • ...