Процедура карты Пролога, которая применяет предикат к элементам списка
Как вы пишете процедуру Пролог 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
- ...