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

40

如何编写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
1个回答

53

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

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

12
在现代的Prolog中,你会在库中找到maplist函数。 - Fred Foo
3
@DavidTonhofer:请参考[tag:meta-predicate]以获取更多信息! - false
1
我不相信 SWI-Prolog 版本的 maplist/3 现在还对应于 map 函数。它似乎是 all 函数,但会从两个列表中以成对的形式输出输入。有没有一个谓词与 map 函数具有相同的功能? - bennyty
3
也许我被文档搞糊涂了。maplist/3中提到,“与maplist/2类似,作用于来自两个列表的一对元素”,这让我(一个初学者)认为maplist/3maplist/2具有相同的功能,只是第一个参数接受了不同的输入。因此,我忽略了maplist/3,自己编写或查找其他的map谓词。 - bennyty
2
@bennyty:实际上,那份文档有点误导。 - false
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接