3

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

call(succ(1), R).

是相同的

succ(1, R).

但是,我不想附加到参数列表,而是预先添加,例如

callpre(succ(1), R).

应该导致

succ(R, 1).

如何将参数添加到目标参数列表中并调用结果目标?

4

2 回答 2

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, *). 
于 2016-10-21T18:29:05.287 回答
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].

于 2016-10-21T15:36:25.523 回答