# Implementing a zipwithindex predicate in prolog

I want to implement a predicate of the form:

zipwithindex(?List1, ?List2)


which is true when the elements of List2 are the same as in List1 but are paired with the index of the element.

This is what I have:

zipwithindex([],I,S,S).
zipwithindex([H|T],I,S0,S):-
append(S0,[H/I],S1),
I1 is I+1,
zipwithindex(T,I1,S1,S).
zipwithindex(List1,List2):-
zipwithindex(List1,0,[],List2).


Is there a better way to implement this?

zipwithindex(List1, List2) :-

• I would suggest bagof/3 instead of findall/3 in this case as, if there are unbound variables in List1, List2 will have new variables instead of the original ones. E.g. ?- zipwithindex([X,Y,Z],L2). will produce L2 = [_G41/0, _G35/1, _G29/2]. Jun 9 '14 at 7:46