Получить индекс данного элемента в списке - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь решить некоторые основные головоломки, чтобы выучить пролог.Я пытаюсь получить индекс данного элемента в списке с помощью рекурсии.Я застрял, пытаясь решить проблему, и я не уверен, почему.Когда я выполняю это, он возвращает только «false» вместо индекса.

elem(_, [], 0).

elem(E, [E | T], RES) :-
    elem(E, T, CUR_RES), RES is CUR_RES + 1. 

Пример запроса, который я использую для проверки кода elem(2, [1, 2], X).

1 Ответ

0 голосов
/ 20 февраля 2019

Ваша проблема с

elem(2, [1, 2], X).

заключается в том, что при попытке объединения с базовым регистром

 elem(_, [], 0).

происходит сбой, поскольку второй параметр не пуст.

Когда он пытается объединиться с рекурсивным регистром,

elem(E, [E | T], RES) :-
    elem(E, T, CUR_RES), 
    RES is CUR_RES + 1.

E равен 2, что требует, чтобы список был [2|T], но так как список равен [1,2], он также не может объединить.

Это ближе к тому, что вы хотите

elem(E,[E|_],0).

elem(E,[_|T],Res) :-
    elem(E,T,Cur_rest),
    Res is Cur_rest + 1.

Пример выполнения:

?- elem(2, [1, 2], X).
X = 1 ;
false.

?- elem(1, [1, 2], X).
X = 0 ;
false.

?- elem(4, [1,2,3,4,5], X).
X = 3 ;
false.

Необходимо выполнить сопоставление для значения, которое вы ищете в базовом случаеа не рекурсивный случай.Как только вы это сделаете, остальные изменения следуют по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...