1

这两个目标有什么区别?

foo(A) :- A, !, fail.
foo(A).
foo(A) :- call(A), !, fail.
foo(A).

他们的行为似乎相同?目的是什么call/1?是否有一个例子说明何时重要?

4

1 回答 1

1

这些代码片段生成的输出 WAM 代码没有区别,如发出

gplc -w snippet1.pl
gplc -w snippet2.pl

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

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

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

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]).

唯一的区别是子句的标题,在另一个片段中读取:

clause(:-(foo(A),','(call(A),','(!,fail))),[
于 2020-10-19T18:07:01.037 回答