Prolog: How to check if a predicate exists?

How to check if a predicate exists in Prolog? This will be exists/1 , for example:

 ?- exists(some_predicate). false. ?- assert(some_predicate). true. ?- exists(some_predicate). true. 
+8
prolog
source share
2 answers

You can use current_predicate / 1 , current_predicate / 2 or predicate_property / 2 (for the latter, you probably need 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 and predicate_property/2 (with visible) succeeds if the predicate can be loaded automatically and currrent_predicate/1 fails

+11
source share

"old fashioned way" but accepted in ISO, clause / 2. You may encounter this when reusing / viewing some old examples.

Example:

 ?- [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). 
+1
source share

All Articles