2012-05-02 3 views
3

Можно ли определить список, состоящий из предикатов и как я могу назвать предикаты.Список предикатов в Prolog

Также возможно передать один предикат другому предикату (например, проходящим атомам)?

Пример:

pre1:- something. 
pre2(Predicate1, List):- 
    call(Predicate1), 
    append([Predicate1], List, R), 
    ..... 
+0

Ответ, который, я думаю, вы ищете, находится здесь: http://stackoverflow.com/questions/8687306/best-way-to-define-predicate-in-prolog –

+0

@AndreiBogdan Я добавил пример, чтобы лучше проиллюстрировать что я имею в виду. –

+1

Возможно, вы захотите прочитать [эту вещь] (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

ответ

5

Вы не можете хранить предикаты в списке, но вы можете хранить термины (или функторы) и называть термины, как целей.

Вот предикат, который проверяет, имеет ли термин свойства, описанные в списке функторов:

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) будет иметь тот же эффект. Возможно, все же стоит узнать о =.., хотя, как вы можете столкнуться с ним в коде других людей.

+0

Спасибо! Это именно то, что я искал. Теперь мне нужно получить значение из цели после его вызова –

+3

Пожалуйста, рассмотрите 'call (P, X)' вместо '(= ..)/2' и' call/1'! Это намного быстрее, чище и даже более общее! – false

+1

@false: хорошая точка. Однако руководство SWI предполагает, что 'call/2' не находится в ISO Prolog. –

Смежные вопросы