2012-10-14 9 views

Répondre

11

Vous pouvez utiliser current_predicate/1, current_predicate/2 ou predicate_property/2 (pour la dernière, vous aurez probablement besoin 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 et predicate_property/2 (avec visible) réussit si le prédicat peut être chargé automatiquement tandis que currrent_predicate/1 échoue

1

la «façon à l'ancienne», mais acceptée en ISO, est clause/2. Vous pourriez le rencontrer en réutilisant/parcourant certains des exemples plus anciens.

exemple:

?- [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). 
+2

Ceci est accepté dans la norme ISO que pour les prédicats avec la propriété publique! Par défaut, cela ne fonctionne pas pour le code statique. – false