39

如何编写map(List, PredName, Result)将谓词应用于PredName(Arg, Res)元素List并在列表中返回结果的 Prolog 过程Result

例如:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
4

1 回答 1

52

这通常被称为Prolog prologuemaplist/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-goals。

?- maplist(maplist(test),[[1,2],[3,4]],Rss).
Rss = [[1,4],[9,16]].

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

  • maplist/2对应于all
  • maplist/3对应于map
  • maplist/4对应zipWith但也unzip
  • maplist/5对应于zipWith3unzip3
  • ...
于 2011-07-13T18:08:14.710 回答