Comment écrivez-vous une procédure Prolog map(List, PredName, Result)
qui applique le prédicat PredName(Arg, Res)
aux éléments de List
et renvoie le résultat dans la liste Result
?
Par exemple:
test(N,R) :- R is N*N.
?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
Ceci est généralement appelé maplist/3
Et fait partie du Prologue prologue . Notez l'ordre différent des arguments!
:- meta_predicate maplist(2, ?, ?).
maplist(_C_2, [], []).
maplist( C_2, [X|Xs], [Y|Ys]) :-
call(C_2, X, Y),
maplist( C_2, Xs, Ys).
L'ordre différent des arguments vous permet d'imbriquer facilement plusieurs objectifs maplist
-.
?- maplist(maplist(test),[[1,2],[3,4]],Rss).
Rss = [[1,4],[9,16]].
maplist
vient dans différentes arités et correspond à les constructions suivantes dans les langages fonctionnels , mais nécessite que toutes les listes soient de même longueur. Notez que Prolog n'a pas l'asymétrie entre Zip
/zipWith
et unzip
. Un objectif maplist(C_3, Xs, Ys, Zs)
subsume les deux et offre même des utilisations plus générales.
maplist/2
Correspond à all
maplist/3
Correspond à map
maplist/4
Correspond à zipWith
mais aussi unzip
maplist/5
Correspond à zipWith3
Et unzip3