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

时间:2012-10-14 20:22:05

标签: prolog

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

?- exists(some_predicate).
false.

?- assert(some_predicate).
true.

?- exists(some_predicate).
true.

2 个答案:

答案 0 :(得分:13)

您可以使用current_predicate/1current_predicate/2predicate_property/2(最后您可能需要functor/3):

?- current_predicate(a/1).
false.

?- functor(A,a,1),predicate_property(A,visible).
false.

?- functor(A,a,1),current_predicate(_,A).
false.

?- assert(a(42)).
true.

?- current_predicate(a/1).
true.

?- functor(A,a,1),predicate_property(A,visible).
A = a(_G136).

?- functor(A,a,1),current_predicate(_,A).
A = a(_G122).
如果current_predicate/2失败时谓词可以自动加载,则

predicate_property/2currrent_predicate/1(可见)成功

答案 1 :(得分:1)

'老式方式',但在ISO中被接受,是clause / 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).