Procedimiento de mapa Prolog que aplica el predicado a los elementos de la lista
map-function meta-predicate (1)
Esto generalmente se llama maplist/3
y es parte del prólogo de Prolog . ¡Note el diferente orden de los argumentos!
:- meta_predicate maplist(2, ?, ?).
maplist(_C_2, [], []).
maplist( C_2, [X|Xs], [Y|Ys]) :-
call(C_2, X, Y),
maplist( C_2, Xs, Ys).
El orden diferente de los argumentos le permite jerarquizar fácilmente varios maplist
mapas.
?- maplist(maplist(test),[[1,2],[3,4]],Rss).
Rss = [[1,4],[9,16]].
maplist
viene en aries diferentes y corresponde a las siguientes construcciones en lenguajes funcionales , pero requiere que todas las listas tengan la misma longitud. Tenga en cuenta que Prolog no tiene la asimetría entre zip
/ zipWith
y unzip
. Una lista de maplist(C_3, Xs, Ys, Zs)
objetivos maplist(C_3, Xs, Ys, Zs)
subsume ambos e incluso ofrece usos más generales.
-
maplist/2
corresponde aall
-
maplist/3
corresponde almap
-
maplist/4
corresponde azipWith
pero tambiénunzip
-
maplist/5
corresponde azipWith3
yunzip3
- ...
¿Cómo se escribe un map(List, PredName, Result)
procedimiento Prolog map(List, PredName, Result)
que aplica el predicado PredName(Arg, Res)
a los elementos de List
y se devuelve el resultado en la lista Result
?
Por ejemplo:
test(N,R) :- R is N*N.
?- map([3,5,-2], test, L).
L = [9,25,4] ;
no