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

Как вы пишете процедуру Пролог 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 ответ

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

  • maplist/2 соответствует all
  • maplist/3 соответствует map
  • maplist/4 соответствует zipWith но также unzip
  • maplist/5 соответствует zipWith3 а также unzip3
  • ...
Другие вопросы по тегам