Вы не можете хранить предикаты в списке, но вы можете хранить термины (или функторы) и называть термины, как целей.
Вот предикат, который проверяет, имеет ли термин свойства, описанные в списке функторов:
has_properties([], _).
has_properties([P|Ps], X) :-
Goal =.. [P, X], % construct goal P(X)
call(Goal),
has_properties(Ps, X).
Использование:
% is 4 a number, an integer and a foo?
?- has_properties([number, integer, foo], 4).
Ответ на этот запрос будет зависеть от вашего определения foo/1
, конечно. См. Мой explanation of =..
, если необходимо.
Edit: в @false отчетов в комментариях, не нужно использовать =..
, поскольку Goal =.. [P, X], call(Goal)
можно заменить call(P, X)
будет иметь тот же эффект. Возможно, все же стоит узнать о =..
, хотя, как вы можете столкнуться с ним в коде других людей.
Ответ, который, я думаю, вы ищете, находится здесь: http://stackoverflow.com/questions/8687306/best-way-to-define-predicate-in-prolog –
@AndreiBogdan Я добавил пример, чтобы лучше проиллюстрировать что я имею в виду. –
Возможно, вы захотите прочитать [эту вещь] (http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%274.20%27,swi%28%27/doc/Manual/manipterm. html% 27% 29% 29) – m09