Как вычислить индекс элемента в списке? - PullRequest
8 голосов
/ 07 декабря 2010

Я начинаю играть с прологом, и с фоном Java это действительно сложно для меня, поэтому вот глупый вопрос:

Как вы будете писать предикат indexOf, способный дать индекс данного элементав заданном списке?

Мой первый вопрос о предикатной арности: я думаю, это должно быть 3, например:

indexOf(List,Element, Index) :- ......

Я прав?Может быть, это уже существует во встроенных библиотеках, но я хочу научиться писать это.Спасибо за вашу помощь.

Ответы [ 3 ]

11 голосов
/ 07 декабря 2010

Вы можете сделать это рекурсивно: предположим, что индекс на основе 0 (в противном случае просто измените 0 на 1 в первом предложении)

indexOf([Element|_], Element, 0). % We found the element
indexOf([_|Tail], Element, Index):-
  indexOf(Tail, Element, Index1), % Check in the tail of the list
  Index is Index1+1.  % and increment the resulting index

Если вы хотите найти только первое появление, вы можете добавить вырезку (!), Чтобы избежать возврата.

indexOf([Element|_], Element, 0):- !.
indexOf([_|Tail], Element, Index):-
  indexOf(Tail, Element, Index1),
  !,
  Index is Index1+1.
1 голос
/ 18 декабря 2012

Следует использовать хвостовую рекурсию:

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 или чего-то еще.

0 голосов
/ 08 апреля 2014

Я сделал это в записи преемника, и это довольно кратко и аккуратно:

index([V|_],V,0).
index([_|T],V,s(I)) :- index(T,V,I).

Пример выходных данных:

?- index([a,b,c,a],a,X).
X = 0 ;
X = s(s(s(0))) ;
false.

?- index(List,a,s(0)).
List = [_G1710, a|_G1714].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...