Процедура карты Пролога, которая применяет предикат к элементам списка - PullRequest
31 голосов
/ 13 июля 2011

Как написать процедуру Пролог 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

1 Ответ

41 голосов
/ 13 июля 2011

Обычно это называется 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 -го целей.

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

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

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