如何编写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
如何编写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
,是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
/zipWith
和unzip
之间的不对称性。目标maplist(C_3, Xs, Ys, Zs)
包含了两者甚至还提供了更一般的用途。
maplist/2
对应于 all
maplist/3
对应于 map
maplist/4
对应于 zipWith
但也包括 unzip
maplist/5
对应于 zipWith3
和 unzip3
maplist
函数。 - Fred Foomaplist/3
和maplist/2
具有相同的功能,只是第一个参数接受了不同的输入。因此,我忽略了maplist/3
,自己编写或查找其他的map谓词。 - bennyty