call(Goal,Arg)允许将参数 Arg 附加到 Goal 的参数并调用结果目标,例如
call(succ(1), R).
是相同的
succ(1, R).
但是,我不想附加到参数列表,而是预先添加,例如
callpre(succ(1), R).
应该导致
succ(R, 1).
如何将参数添加到目标参数列表中并调用结果目标?
call(Goal,Arg)允许将参数 Arg 附加到 Goal 的参数并调用结果目标,例如
call(succ(1), R).
是相同的
succ(1, R).
但是,我不想附加到参数列表,而是预先添加,例如
callpre(succ(1), R).
应该导致
succ(R, 1).
如何将参数添加到目标参数列表中并调用结果目标?
对于任意数量的参数,您可以将其定义为
callpre(MGoal, Arg) :-
strip_module(MGoal, M, Goal),
Goal =.. [F | Args],
NewGoal =.. [F, Arg|Args],
M:NewGoal.
您还需要meta_predicate/1
为此声明:
:- meta_predicate callpre(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]
.