元谓词 - Prolog 绑定参数



在sicstus prolog中,有一个谓词:

maplist(:Pred, +List)

Pred应该只接受一个参数 - List元素。如何传递定义第一个参数的 2 参数谓词?在其他语言中,它将写成:

maplist(pred.bind(SomeValue), List)

maplist(P_1, Xs)将为Xs的每个元素调用call(P_1, X)。内置谓词call/2P_1添加一个参数,然后用 call/1 调用它。 为了表明需要进一步的参数,使用像P_1这样的名称是非常有帮助的,意思是"需要一个额外的参数"。

因此,如果您已经有 arity 2 的谓词,例如 (=)/2 ,您将=(2)传递给 maplist:

?- maplist(=(2), Xs).
   Xs = []
;  Xs = [2]
;  Xs = [2,2]
;  ... .

由于SICStus库中的定义很遗憾不正确,因此请使用以下定义:

:- meta_predicate(maplist(1,?)).
:- meta_predicate(maplist_i(?,1)).
maplist(P_1, Xs) :-
   maplist_i(Xs, P_1).
maplist_i([], _P_1).
maplist_i([E|Es], P_1) :-
   call(P_1, E),
   maplist_i(Es, P_1).

请参阅此答案了解更多信息。

这只是一个关于列表列表的很好的例子。

?- Xss = [[A],[B,C]], maplist(maplist(=(E)), Xss).
   Xss = [[E], [E, E]], A = B, B = C, C = E.

最新更新