Вопрос по list, prolog – Список предикатов в Прологе

3

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

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

Пример:

<code>pre1:- something.
pre2(Predicate1, List):-
    call(Predicate1),
    append([Predicate1], List, R),
    .....
</code>
Ответ, который, я думаю, вы ищете, находится здесь:stackoverflow.com/questions/8687306/… Andrei Bogdan
@ Могу это многообещающе, но я не могу найти никаких примеров Rob Fox
Вы можете прочитатьthis thing m09
@AndreiBogdan Я добавил пример, чтобы лучше проиллюстрировать, что я имею в виду. Rob Fox
Можете ли вы объяснить, чего вы хотите достичь, более подробно? Вы уже упоминалиcall/1 в вашем примере, поэтому я не могу видеть, что еще вам нужно знать ... twinterer

Ваш Ответ

1   ответ
5

predicates в списке, но вы можете хранитьterms (или функторы) и называть термины какgoals.

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

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, конечно. См мойобъяснение=.. если нужно.

Edit: как @false сообщает в комментариях, использовать его не обязательно=.., посколькуGoal =.. [P, X], call(Goal) можно заменить наcall(P, X) будет иметь тот же эффект. Возможно, стоит узнать о=..тем не менее, как вы можете столкнуться с этим в коде других людей.

Пожалуйста примите к сведениюcall(P, X) вместо(=..)/2 а такжеcall/1! Это намного быстрее, чище и даже более общее!
@larsmans: это руководство явно устарело. Начиная с Cor.2: 2012 это ISO. Пожалуйста, обратитесь кtag iso-prolog!
@ Ложь: хорошая мысль. Тем не менее, руководство SWI предполагает, чтоcall/2 не в ISO Пролог.
@larsmans: ваша поправка нуждается в уточнении: версия сcall(P,X) является более общим, так что это не тот же эффект.P не нужно быть атомом!P может быть напримерbetween(1,10).
@larsmans: вотup-to-date SWI manual, Ну, ясно, почему получение стандарта необходимо!

Похожие вопросы