这两个目标有什么区别?
foo(A) :- A, !, fail.
foo(A).
foo(A) :- call(A), !, fail.
foo(A).
他们的行为似乎相同?目的是什么call/1
?是否有一个例子说明何时重要?
这两个目标有什么区别?
foo(A) :- A, !, fail.
foo(A).
foo(A) :- call(A), !, fail.
foo(A).
他们的行为似乎相同?目的是什么call/1
?是否有一个例子说明何时重要?
这些代码片段生成的输出 WAM 代码没有区别,如发出
gplc -w snippet1.pl
gplc -w snippet2.pl
并检查生成的wbc
文件(其中snippetN.pl
包含示例代码)。因此,使用哪一个似乎是程序员的选择。call/1
出于可移植性原因使用它可能很有用。
但是回想一下call/N
N > 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))),[