Найти все предложения, связанные с атомом - PullRequest
3 голосов
/ 27 апреля 2010

Это, вероятно, очень глупый вопрос (я только начал изучать Пролог несколько часов назад), но возможно ли найти все пункты, относящиеся к атому? Например, предполагая следующую базу знаний:

cat(tom).
animal(X) :- cat(X).

, есть ли способ получить всевозможную информацию о Томе (или хотя бы все факты, которые явно указаны в базе)? Я понимаю, что такой запрос невозможен:

?- Pred(tom).

поэтому я подумал, что смогу написать правило, которое выведет правильную информацию:

meta(Object, Predicate) :-
    Goal =.. [Predicate, Object],
    call(Goal).

, чтобы я мог писать запросы, такие как

?- meta(tom, Predicate).

но это не работает, потому что аргументы для call не созданы достаточно. Итак, в основном мой вопрос: это вообще возможно, или Prolog не предназначен для предоставления такого рода информации? А если это невозможно, то почему?

1 Ответ

1 голос
/ 28 апреля 2010

Вы можете использовать предикат ISO "current_predicate / 1", чтобы узнать, что вы можете вызвать. Вот пример программы:

cat(tom).
animal(X) :- cat(X).

info(Arg,Info) :- current_predicate(PredName/1),
     Info =.. [PredName,Arg], call(Info).
all_info(Arg,L) :- findall(I,info(Arg,I),L).

Вы можете использовать программу следующим образом (кстати, я использую SICStus Prolog):

| ?- info(tom,X).
X = animal(tom) ? ;
X = cat(tom) ? ;
no
| ?- all_info(tom,X).
X = [animal(tom),cat(tom)] ? 
yes

Как правило, вы можете использовать

current_predicate
следующим образом:
| ?- current_predicate(X).
X = info/2 ? ;
X = animal/1 ? ;
X = cat/1 ? ;
X = all_info/2 ? ;
no
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...