这两个目标之间有什么区别?
foo(A) :- A, !, fail.
foo(A).foo(A) :- call(A), !, fail.
foo(A).他们的行为似乎是一样的?call/1的用途是什么?有没有一个例子说明它什么时候重要?
发布于 2020-10-20 02:07:01
由这些代码片段生成的输出WAM代码没有区别,执行以下命令可以证明这一点
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)。
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))),[https://stackoverflow.com/questions/64432746
复制相似问题