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
maplist(=(1), L)
успешно работает только с одним ответомL = []
. Дальнейшие ответы ошибочно опущены. См. ссылку выше, как вы можете определить этот предикат самостоятельно! - person false   schedule 10.06.2015