call(Goal,Arg)允许将参数Arg附加到Goal的参数并调用结果目标,例如
call(succ(1), R).
与
相同succ(1, R).
但是,我不想附加到参数列表,而是添加前缀,例如。
callpre(succ(1), R).
应该导致
succ(R, 1).
我如何在Goal的参数列表中添加参数并调用最终目标?
答案 0 :(得分:2)
对于任意数量的参数,您可以将其定义为
callpre(MGoal, Arg) :-
strip_module(MGoal, M, Goal),
Goal =.. [F | Args],
NewGoal =.. [F, Arg|Args],
M:NewGoal.
您还需要meta_predicate/1
声明:
:- meta_predicate callpre(1, *).
答案 1 :(得分:1)
您可以将其定义为:
callpre(Goal,Z):-
Goal=.. [Predicate, Y],
Goal2=.. [Predicate, Z],
call(Goal2,Y).
如果目标有多个参数,你可以写:
callpre(Goal,Z):-
Goal=.. [Predicate,Arg1| Y],
reverse([Arg1|Y],[H|T]),
reverse(T,T1),
Goal2=.. [Predicate,Z| T1],
call(Goal2,H).
(这也适用于一个参数)
请注意,=../2
运算符使用列表(例如succ(X,Y)=.. [succ,X,Y]
)统一仿函数和参数。