首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在call/2中增加参数列表吗?

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

Stack Overflow用户
提问于 2016-10-21 10:15:06
回答 2查看 322关注 0票数 3

呼叫(目标,Arg)允许将参数Arg附加到目标的参数并调用结果目标。

代码语言:javascript
复制
call(succ(1), R).

是相同的

代码语言:javascript
复制
succ(1, R).

但是,我不想附加到参数列表中,而是放在前面。

代码语言:javascript
复制
callpre(succ(1), R).

应导致

代码语言:javascript
复制
succ(R, 1).

如何将参数放在目标参数列表的前面,并调用结果目标?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-21 18:29:05

对于任意数量的参数,可以将其定义为

代码语言:javascript
复制
callpre(MGoal, Arg) :-
    strip_module(MGoal, M, Goal), 
    Goal =.. [F | Args],
    NewGoal =.. [F, Arg|Args], 
    M:NewGoal.

为此,您还需要一个meta_predicate/1声明:

代码语言:javascript
复制
:- meta_predicate callpre(1, *). 
票数 2
EN

Stack Overflow用户

发布于 2016-10-21 15:36:25

您可以将其定义为:

代码语言:javascript
复制
callpre(Goal,Z):-
  Goal=.. [Predicate, Y],
  Goal2=.. [Predicate, Z],
  call(Goal2,Y).

如果目标有多个参数,您可以编写:

代码语言:javascript
复制
  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] )统一起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40173981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档