2011-06-06 7 views
7

Supongamos que tengo unos hechos DB llenos de al menos:¿Cómo encontrar todas las reglas de prólogo en la base de datos

fact1(A) :- !, A=ok. 
fact2(B) :- !, B=ok. 

¿Cómo puedo enumerar todos los hechos de este db? Lo ideal sería que tendría un predicado que podría utilizar:

?- all_rules(Head :- Tail). 
Head=fact1(_G100), 
Tail=(!, _G100=ok) ; 
Head=fact2(_G101), 
Tail=(!, _G101=ok) 
....followed by all other predicates in other modules loaded... 

encontré current_predicate/1, pero no puedo imaginar lo que esto está haciendo realidad ...

Respuesta

7

Depende del sistema Prolog preciso que esté utilizando. Siempre y cuando solo desee ver las definiciones, listing/0 funciona en muchos sistemas. Pero listing/0 solo imprime un texto. clause/2 a menudo funciona solo para predicados declarados dinámicamente.

6

Tal vez algo como esto:

?- current_predicate(Name/Arity), 
    functor(Pred, Name, Arity), 
    nth_clause(Pred, Index, Ref), 
    clause(Head, Body, Ref). 

Más información en Examining the program.

+1

consider 'functor (Pred, Name, Arity)' – false

+1

¡cláusula/2 es exactamente lo que estoy buscando! En este ejemplo, creo que llamarlo con cláusula (Cabeza, Cuerpo) me daría Head = hecho (A), Cuerpo = (!, A = ok) – DaveEdelstein

+1

@false Gracias, corregido. – Kaarel

Cuestiones relacionadas