Procedimiento de mapa Prolog que aplica el predicado a los elementos de la lista

¿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 

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) objectives maplist(C_3, Xs, Ys, Zs) subsume ambos e incluso ofrece usos más generales.

  • maplist/2 corresponde a all
  • maplist/3 corresponde al map
  • maplist/4 corresponde a zipWith pero también unzip
  • maplist/5 corresponde a zipWith3 y unzip3