\$\begingroup\$
\$\endgroup\$
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?
Jamal
35.2k13 gold badges134 silver badges238 bronze badges
1 Answer 1
\$\begingroup\$
\$\endgroup\$
1
sure:
zipwithindex(List1, List2) :-
findall(E/I, nth0(I, List1, E), List2).
Edit - after Tudor' comment
bagof/3 it's much better than findall/3, as it doesn't introduce unwanted new variables. This can be of utmost importance when working with constrained variables - i.e. CLP(FD) or CHR
answered May 10, 2014 at 20:50
-
3\$\begingroup\$ I would suggest
bagof/3
instead offindall/3
in this case as, if there are unbound variables inList1
,List2
will have new variables instead of the original ones. E.g.?- zipwithindex([X,Y,Z],L2).
will produceL2 = [_G41/0, _G35/1, _G29/2].
\$\endgroup\$Tudor Berariu– Tudor Berariu2014年06月09日 07:46:11 +00:00Commented Jun 9, 2014 at 7:46
default