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

将谓词应用于列表元素的Prolog映射过程,prolog,map-function,meta-predicate,Prolog,Map Function,Meta Predicate,如何编写一个Prolog过程map(List,PredName,Result),将谓词PredName(Arg,Res)应用于List的元素,并在ListResult中返回结果 例如: 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, [], []).

如何编写一个Prolog过程
map(List,PredName,Result)
,将谓词
PredName(Arg,Res)
应用于
List
的元素,并在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
/
zipWith
unzip
之间没有不对称性。目标
maplist(C_3,Xs,Ys,Zs)
包含了这两者,甚至提供了更广泛的用途

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

+1。在现代序言中,您可以在库中的某个地方找到
maplist
。@DavidTonhofer:有关详细信息,请参阅!我不相信maplist/3的SWI Prolog版本与map相对应。它似乎是
all
,但从两个列表中成对地传递输入。是否有一个谓词具有与
map
相同的功能?可能我被文档弄糊涂了,“作为maplist/2,对来自两个列表的成对元素进行操作”对我(一个初学者prolog程序员)来说意味着
maplist/3
具有与
maplist/2
相同的功能,即
all
,但对第一个参数的输入不同。这导致我忽略了maplist/3,并查找/编写了我自己的映射谓词。@Benny:那个文档实际上有点误导。