Procedura della mappa Prolog che applica il predicato per elencare gli elementi

Come si scrive una map(List, PredName, Result) procedura Prolog map(List, PredName, Result) che applica il predicato PredName(Arg, Res) agli elementi di List e restituisce il risultato nell’elenco Result ?

Per esempio:

 test(N,R) :- R is N*N. ?- map([3,5,-2], test, L). L = [9,25,4] ; no 

Questo è solitamente chiamato maplist/3 ed è parte del prologo Prolog . Nota il diverso ordine degli argomenti!

 :- meta_predicate maplist(2, ?, ?). maplist(_C_2, [], []). maplist( C_2, [X|Xs], [Y|Ys]) :- call(C_2, X, Y), maplist( C_2, Xs, Ys). 

Il diverso ordine delle argomentazioni consente di annidare facilmente diversi maplist lista di mappe.

 ?- maplist(maplist(test),[[1,2],[3,4]],Rss). Rss = [[1,4],[9,16]]. 

maplist delle mappe ha diverse origini e corrisponde ai seguenti costrutti nei linguaggi funzionali , ma richiede che tutte le liste abbiano la stessa lunghezza. Nota che Prolog non ha l’asimmetria tra zip / zipWith e unzip . Una maplist(C_3, Xs, Ys, Zs) obiettivi maplist(C_3, Xs, Ys, Zs) sussume entrambi e offre anche usi più generali.

  • maplist/2 corrisponde a all
  • maplist/3 corrisponde alla map
  • maplist/4 corrisponde a zipWith ma anche unzip
  • maplist/5 corrisponde a zipWith3 e unzip3