Prolog 绑定参数
Prolog binding arguments
在 sicstus 序言中,有一个谓词:
maplist(:Pred, +List)
Pred
应该只接受一个参数 - List
元素。如何传递定义了第一个参数的 2 参数谓词?在其他语言中,它会写成:
maplist(pred.bind(SomeValue), List)
maplist(P_1, Xs)
将为 Xs
的每个元素调用 call(P_1, X)
。内置谓词 call/2
向 P_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).
有关更多信息,请参阅 this answer。
关于列表列表的一个很好的进一步示例。
?- Xss = [[A],[B,C]], maplist(maplist(=(E)), Xss).
Xss = [[E], [E, E]],
A = B, B = C, C = E.
在 sicstus 序言中,有一个谓词:
maplist(:Pred, +List)
Pred
应该只接受一个参数 - List
元素。如何传递定义了第一个参数的 2 参数谓词?在其他语言中,它会写成:
maplist(pred.bind(SomeValue), List)
maplist(P_1, Xs)
将为 Xs
的每个元素调用 call(P_1, X)
。内置谓词 call/2
向 P_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).
有关更多信息,请参阅 this answer。
关于列表列表的一个很好的进一步示例。
?- Xss = [[A],[B,C]], maplist(maplist(=(E)), Xss).
Xss = [[E], [E, E]],
A = B, B = C, C = E.