呼叫(目标,Arg)允许将参数Arg附加到目标的参数并调用结果目标。
call(succ(1), R).是相同的
succ(1, R).但是,我不想附加到参数列表中,而是放在前面。
callpre(succ(1), R).应导致
succ(R, 1).如何将参数放在目标参数列表的前面,并调用结果目标?
发布于 2016-10-21 18:29:05
对于任意数量的参数,可以将其定义为
callpre(MGoal, Arg) :-
strip_module(MGoal, M, Goal),
Goal =.. [F | Args],
NewGoal =.. [F, Arg|Args],
M:NewGoal.为此,您还需要一个meta_predicate/1声明:
:- meta_predicate callpre(1, *). 发布于 2016-10-21 15:36:25
您可以将其定义为:
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] )统一起来。
https://stackoverflow.com/questions/40173981
复制相似问题