web-dev-qa-db-fra.com

Procédure de carte Prolog qui applique un prédicat aux éléments de liste

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
36
General_9

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
  • ...
44
false