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 对应于 allmaplist/3 对应于 mapmaplist/4对应zipWith但也unzipmaplist/5对应于zipWith3和unzip3