call/1 和普通子句有什么区别?

Whats the difference between call/1 and normal clause?

如果我有:

 run(X) :- X.

有什么区别:

... :- ..., call(Y).

和:

... :- ..., run(Y).

如果你有:

run(X) :- X.

然后你可以看到它等价于通过

显式使用call/1
?- listing(run/1).
run(A) :-
        call(A).

由此可知,call(X) 在声明上也等同于 run(X)。但是,除非您的 Prolog 编译器执行某种内联,否则使用 call/1 直接 几乎可以肯定至少比调用 run/1 效率更高,并且有调用 call/1.

作为思考的食物,想想像 run(!) 这样的情况,如果 X 不是 ,那么在元调用中通常使用 ! 会如何影响程序 相当于 call(X).