Следует использовать хвостовую рекурсию:
indexOf(V, [H|T], A, I)
:-
Value = H, A = I, !
;
ANew is A + 1,
indexOf(V, T, ANew, I)
.
indexOf(Value, List, Index)
:-
indexOf(Value, List, 0, Index)
.
indexOfWithoutFailure(Value, List, Index)
:-
indexOf(Value, List, 0, Index)
;
Index = -1
.
Некоторые примеры запросов:
?- indexOf(d, [a, b, c, d, e, f], Index).
Index = 3.
?- indexOf(x, [a, b, c, d, e, f], Index).
false.
?- indexOfWithoutFailure(x, [a, b, c, d, e, f], Index).
Index = -1.
Если вы хотите получить все индексы элемента в списке, вам следуетнапишите другой предикат для него без разреза с именем allIndexesOf или чего-то еще.