11

Prologプログラムに述語が存在するかどうかを確認するにはどうすればよいですか?これはexists/1、次のようになります。

?- exists(some_predicate).
false.

?- assert(some_predicate).
true.

?- exists(some_predicate).
true.
4

2 に答える 2

15

current_predicate/1current_predicate/2またはpredicate_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/2(visible を使用して) 述語を自動ロードできる場合は成功し、currrent_predicate/1失敗した場合

于 2012-10-14T20:40:05.320 に答える
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).
于 2012-10-14T21:07:27.950 に答える