Как найти все правила prolog в базе данных

#prolog

#пролог

Вопрос:

Предположим, у меня есть база данных фактов, заполненная как минимум:

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

Как я могу перечислить все факты в этой базе данных? В идеале у меня был бы предикат, который я мог бы использовать:

 ?- 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...
  

Я нашел current_predicate / 1, но я не могу понять, что это на самом деле делает…

Ответ №1:

Это зависит от конкретной системы Prolog, которую вы используете. Пока вы хотите только взглянуть на определения, listing/0 работает во многих системах. Но listing/0 печатается только текст. clause/2 часто работает только для предикатов, объявленных динамически.

Ответ №2:

Может быть, что-то вроде этого:

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

Подробнее читайте в разделе Изучение программы.

Комментарии:

1. рассмотрим functor(Pred, Name, Arity)

2. пункт / 2 — это именно то, что я ищу! В этом примере, я полагаю, вызов его с помощью предложения (Head, Body) дал бы мне Head= fact (A), Body = (!, A = ok)