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



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

例如:

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

这通常被称为maplist/3,是序言序言的一部分。注意不同的参数顺序!

:- 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以不同的方式出现,对应于函数式语言中的以下结构,但要求所有列表的长度相同。注意Prolog没有zip/zipWithunzip之间的不对称。目标maplist(C_3, Xs, Ys, Zs)包含了两者,甚至提供了更一般的用途。

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

最新更新