我可以在call / 2中添加参数列表吗?

时间:2016-10-21 10:15:06

标签: prolog meta-predicate

call(Goal,Arg)允许将参数Arg附加到Goal的参数并调用结果目标,例如

call(succ(1), R).

相同
succ(1, R).

但是,我不想附加到参数列表,而是添加前缀,例如。

callpre(succ(1), R).

应该导致

succ(R, 1).

我如何在Goal的参数列表中添加参数并调用最终目标?

2 个答案:

答案 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])统一仿函数和参数。