Подтвердить что ты не робот

Процедура карты Prolog, которая применяет предикат к элементам списка

Как вы пишете процедуру Prolog map(List, PredName, Result), которая применяет предикат PredName(Arg, Res) к элементам List и возвращает результат в списке Result?

Например:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
4b9b3361

Ответ 1

Обычно это называется maplist/3 и является частью пролога Пролога. Обратите внимание на другой порядок аргументов!

:- meta_predicate maplist(2, ?, ?).

maplist(_C_2, [], []).
maplist( C_2, [X|Xs], [Y|Ys]) :-
   call(C_2, X, Y),
   maplist( C_2, Xs, Ys).

Разный порядок аргументов позволяет легко вложить несколько maplist -goals.

?- maplist(maplist(test),[[1,2],[3,4]],Rss).
Rss = [[1,4],[9,16]].

maplist входит в разные категории и соответствует следующие конструкции в функциональных языках, но требует, чтобы все списки имели одинаковую длину. Обратите внимание, что Prolog не имеет асимметрии между zip/zipWith и unzip. Цель maplist(C_3, Xs, Ys, Zs) включает и то, и другое предлагает более общие применения.

  • maplist/2 соответствует all
  • maplist/3 соответствует map
  • maplist/4 соответствует zipWith, но также unzip
  • maplist/5 соответствует zipWith3 и unzip3
  • ...