首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >prolog中不带call/2和不带call/2的目标有什么区别?

prolog中不带call/2和不带call/2的目标有什么区别?
EN

Stack Overflow用户
提问于 2020-10-20 01:54:24
回答 1查看 55关注 0票数 1

这两个目标之间有什么区别?

代码语言:javascript
复制
foo(A) :- A, !, fail.
foo(A).
代码语言:javascript
复制
foo(A) :- call(A), !, fail.
foo(A).

他们的行为似乎是一样的?call/1的用途是什么?有没有一个例子说明它什么时候重要?

EN

回答 1

Stack Overflow用户

发布于 2020-10-20 02:07:01

由这些代码片段生成的输出WAM代码没有区别,执行以下命令可以证明这一点

代码语言:javascript
复制
gplc -w snippet1.pl
gplc -w snippet2.pl

并检查生成的wbc文件(其中snippetN.pl包含两个示例代码)。因此,使用哪一个似乎是程序员的选择。出于可移植性的原因,使用call/1可能会很有用。

但是,回想一下N>1的call/N的存在,如果你想调用一个有参数的目标,这是很有用的。

对于好奇的人,这是生成的wam文件: predicate(foo/1,1,static,private,monofile,global,2)。

代码语言:javascript
复制
clause(:-(foo(A),','(A,','(!,fail))),[
    allocate(1),
    get_variable(y(0),1),
    put_atom(foo,1),
    put_integer(1,2),
    put_atom(true,3),
    call(('$call')/4),
    cut(y(0)),
    fail]).


clause(foo(_),[
    proceed]).

唯一的区别是子句的标题,在另一个代码片段中是这样的:

代码语言:javascript
复制
clause(:-(foo(A),','(call(A),','(!,fail))),[
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64432746

复制
相关文章

相似问题

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