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

Gen*_*l_9 35 prolog meta-predicate map-function

如何编写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
Run Code Online (Sandbox Code Playgroud)

fal*_*lse 43

这通常被称为Prolog序言的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).
Run Code Online (Sandbox Code Playgroud)

不同的参数顺序允许您轻松地嵌套多个maplist目标.

?- maplist(maplist(test),[[1,2],[3,4]],Rss).
Rss = [[1,4],[9,16]].
Run Code Online (Sandbox Code Playgroud)

maplist它来自不同的arities,对应于函数式语言中的以下结构,但要求所有列表具有相同的长度.请注意,Prolog没有zip/ zipWith和之间的不对称性unzip.目标maplist(C_3, Xs, Ys, Zs)包含两者,甚至提供更多的一般用途.

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

  • +1.在现代的Prologs中,你会在图书馆的某个地方找到`maplist`. (7认同)
  • 哇.听起来像是二阶逻辑的偏移.优秀.在[SWI Prolog:Apply](http://www.swi-prolog.org/pldoc/man?section=apply) (4认同)
  • @DavidTonhofer:请参阅[tag:meta-predicate]了解更多信息! (3认同)
  • 也许我对文档感到困惑。[maplist/3](http://www.swi-prolog.org/pldoc/doc_for?object=maplist/3),“作为 maplist/2,对来自两个列表的元素对进行操作”暗示我(新手prolog 程序员),`maplist/3` 与 `maplist/2` 具有相同的功能,后者是 `all`,但第一个参数的输入不同。这导致我忽略了 maplist/3 并找到/编写了我自己的 map 谓词。 (3认同)
  • @bennyty:该文档实际上有点误导。 (2认同)