Prologプログラムに述語が存在するかどうかを確認する方法はありますか?Prolog:述語が存在するかどうかを確認する方法は?
?- exists(some_predicate).
false.
?- assert(some_predicate).
true.
?- exists(some_predicate).
true.
Prologプログラムに述語が存在するかどうかを確認する方法はありますか?Prolog:述語が存在するかどうかを確認する方法は?
?- exists(some_predicate).
false.
?- assert(some_predicate).
true.
?- exists(some_predicate).
true.
あなたはcurrent_predicate/1、current_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
(可視で)成功した場合にはexists/1
、のようになりますcurrrent_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に受け入れられています!デフォルトでは、静的コードでは機能しません。 – false