#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)