Аргументы привязки Prolog

В прологе sicstus есть предикат:

maplist(:Pred, +List)

Pred должен принимать только один аргумент - элемент List. Как я могу передать предикат с двумя аргументами с определенным первым аргументом? На других языках это будет написано так:

maplist(pred.bind(SomeValue), List)

person Sebastian Nowak    schedule 10.06.2015    source источник
comment
См. этот ответ   -  person false    schedule 10.06.2015
comment
Обратите внимание, что определение в SICStus Prolog не совсем корректно. Например, maplist(=(1), L) успешно работает только с одним ответом L = []. Дальнейшие ответы ошибочно опущены. См. ссылку выше, как вы можете определить этот предикат самостоятельно!   -  person false    schedule 10.06.2015
comment
Спасибо, но вопрос в связывающих аргументах, а не в переписывании списка карт.   -  person Sebastian Nowak    schedule 10.06.2015
comment
Пожалуйста, перечитайте строчку выше, я вам привел именно такой пример!   -  person false    schedule 10.06.2015
comment
Спасибо, я неправильно понял этот ответ   -  person Sebastian Nowak    schedule 10.06.2015


Ответы (1)


maplist(P_1, Xs) будет вызывать call(P_1, X) для каждого элемента Xs. Встроенный предикат call/2 добавляет еще один аргумент к P_1 и затем вызывает его с call/1. Чтобы указать, что необходим дополнительный аргумент, очень полезно использовать имя, подобное P_1, означающее, что необходим один дополнительный аргумент.

Итак, если у вас уже есть предикат арности 2, скажем, (=)/2, вы передадите =(2) в список карт:

?- maplist(=(2), Xs).
Xs = [] ;
Xs = [2] ;
Xs = [2,2] ...

Поскольку определение в библиотеке SICStus, к сожалению, неверно, лучше используйте следующее определение:

:- meta_predicate(maplist(1,?)).
:- meta_predicate(maplist_i(?,1)).

maplist(P_1, Xs) :-
   maplist_i(Xs, P_1).

maplist_i([], _P_1).
maplist_i([E|Es], P_1) :-
   call(P_1, E),
   maplist_i(Es, P_1).

Дополнительную информацию см. в этом ответе.

Еще один хороший пример со списками списков.

?- Xss = [[A],[B,C]], maplist(maplist(=(E)), Xss).
Xss = [[E], [E, E]],
A = B, B = C, C = E.
person false    schedule 10.06.2015