Prolog 序言:如何检查谓词是否存在?

Prolog 序言:如何检查谓词是否存在?,prolog,Prolog,如何检查Prolog程序中是否存在谓词?这将是一个存在/1,如: ?- exists(some_predicate). false. ?- assert(some_predicate). true. ?- exists(some_predicate). true. 您可以使用,或者(最后您可能需要): current\u predicate/2和predicate\u property/2(带可见)如果谓词可以自动加载,而current\u predicate/1失败但ISO接受的“老式方

如何检查Prolog程序中是否存在谓词?这将是一个
存在/1
,如:

?- exists(some_predicate).
false.

?- assert(some_predicate).
true.

?- exists(some_predicate).
true.
您可以使用,或者(最后您可能需要):


current\u predicate/2
predicate\u property/2
(带可见)如果谓词可以自动加载,而
current\u predicate/1
失败

但ISO接受的“老式方式”是/2。在重用/浏览一些旧的示例时可能会遇到这种情况

例如:

?- [user].
|: app([], Y, Y).
|: app([X|Xs], Y, [X|Zs]) :- app(Xs, Y, Zs).
|: % user://1 compiled 0,15 sec, 17 clauses
true.

?- clause(app(X,Y,Z),Body).
X = [],
Y = Z,
Body = true ;
X = [_G338|_G339],
Z = [_G338|_G342],
Body = app(_G339, Y, _G342).

这在ISO中仅适用于具有公共属性的谓词!默认情况下,它不适用于静态代码。
?- [user].
|: app([], Y, Y).
|: app([X|Xs], Y, [X|Zs]) :- app(Xs, Y, Zs).
|: % user://1 compiled 0,15 sec, 17 clauses
true.

?- clause(app(X,Y,Z),Body).
X = [],
Y = Z,
Body = true ;
X = [_G338|_G339],
Z = [_G338|_G342],
Body = app(_G339, Y, _G342).