Další relativně obecnou operací se seznamy je spojit dva stejně dlouhé
seznamy do jediného tak, že se na stejnolehlé prvky aplikuje daný
predikát a jím vydaná hodnota se umísťuje na příslušné místo ve výsledném
seznamu:
zip(Pred,[IH1|IT1],[IH2|IT2],[OH|OT]):-
:-@ [Pred,IH1,IH2,OH],
zip(Pred,IT1,IT2,OT).
zip(_,_,[],[]).
zip(_,[],_,[]).
Je zřejmé, že zip(+Fun, +List1, +List2, +OutList)
aplikuje predikát
nejprve na oba první prvky a pak rekurzivně opakuje stejnou
operaci pro zbytky obou seznamů. Pokud jsou seznamy různě dlouhé,
zip/4
vrátí seznam s délkou kratšího z nich.
A jeden příklad použití predikátu zip/4
:
?- zip(+,[1,2,3],[4,5,6],R).
R = [5,7,9]
Yes
dvorka
2013-12-31