current_predicate 在 SICStus Prolog 中

current_predicate in SICStus Prolog

SICStus Prolog 同时提供 current_predicate/1 和 current_predicate/2。

manual page 状态:

current_predicate(?PredSpec)

Unifies PredSpec with a predicate specifications of the form Name/Arity.

current_predicate(?Name, ?Term)

Unifies Name with the name of a user-defined predicate, and Term with the most general term corresponding to that predicate.

它们似乎具有相同的特征: 两个谓词都适用于枚举谓词,都适用于模块。

手册页评论:

current_predicate/1 is part of the ISO Prolog standard; current_predicate/2 is not.

我应该在新的(= 非旧版)代码中使用 current_predicate/2 吗?

简答,没有。不要在新代码中使用它。

current_predicate/2 的好处是允许使用谓词调用 模板 查询是否定义了谓词,这与 current_predicate/1 不同。例如

...,
(   current_predicate(_, foo(_, _)) ->
    foo(A, B)
;   ...
),
...

但您通常可以改用标准 predicate_property/2 谓词,它将模板作为第一个参数。

P.S。如果 Logtalk linter 发现你在调用 current_predicate/2 :-)

,它会向你尖叫(并建议一个更标准的替代方案)