список карт с параметризованным предикатом

Можно ли использовать параметризованный предикат в mapList?

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

Примеры запросов:

?- mapList(p(red, blue), [1,2,3,4], [red, blue, red, blue]).
true.

?- mapList(p(green, blue), [1,2,3,4], [green, blue, green, blue]).
true.

person Community    schedule 26.05.2016    source источник


Ответы (1)


Да, предикат просто получит все дополнительные параметры. После определения p / 4 запуск ваших запросов (после того, как mapList был исправлен на maplist):

?- [user].
p(C1,C2,N,C) :- 0 =:= N mod 2 -> C = C2 ; C = C1.
(^D here)

?- maplist(p(red, blue), [1,2,3,4], L).
L = [red, blue, red, blue].
person CapelliC    schedule 26.05.2016
comment
@HaskellFun и, что более важно, в Прологе предикат call (неявно используемый в maplist) знает, как управлять аргументами. Итак, если у вас есть sum(X, Y, Z) :- Z is X + Y. и вы запросили, call(sum(2), 3, Z). вы получите Z = 5. - person lurker; 26.05.2016
comment
Как функции частичной подачи в функциональных языках! - person ; 26.05.2016