Пролог: отображение n-го элемента списка - PullRequest
0 голосов
/ 03 декабря 2018

Использование пролога:

Запись предиката dispnth для отображения n-го элемента списка.Вы можете предположить, что входной список всегда имеет n или более элементов.

Например: ?- dispnth([1, [2, 3], 4, 5], 2, X). должен вернуть X = [2, 3]

У меня пока есть это:

dispnth([X|_], 0, X).
dispnth([_|Xs], N, X) :- 
   dispnth(N1, X, Xs),
   N is N1 + 1.

1 Ответ

0 голосов
/ 04 декабря 2018

Сначала давайте дадим предикату более описательное имя, скажем, list_nth_element / 3.Далее вы можете рассмотреть вспомогательный предикат list_nth_element_ / 4 с дополнительным аргументом, который содержит текущую позицию.Из вашего приведенного примера я предполагаю, что вы начинаете считать с 1, так что это будет начальное значение для четвертого аргумента.Тогда предикаты могут выглядеть примерно так:

list_nth_element(L,N,E) :-
   list_nth_element_(L,N,E,1).

list_nth_element_([X|Xs],N,X,N).       % if the 2nd and 4th elements are equal X is the nth element
list_nth_element_([_X|Xs],N,E,P0) :-   % if the 2nd and 4th arguments
   dif(P0,N),                          % differ
   P1 is P0+1,                         % increment current position
   list_nth_element_(Xs,N,E,P1).       % and recurse

Таким образом, по существу, четвертый аргумент используется в качестве индикатора позиции, который увеличивается до тех пор, пока вы не достигнете желаемой позиции.Однако нет необходимости иметь этот дополнительный аргумент в реальном интерфейсе предикатов, поэтому он «скрыт» в интерфейсе вспомогательного предиката.

Запрос этого предиката дает желаемый результат:

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

Вы также можете спросить такие вещи, как Какой элемент находится в какой позиции?

   ?- list_nth_element([1, [2, 3], 4, 5], N, X).
N = X = 1 ? ;
N = 2,
X = [2,3] ? ;
N = 3,
X = 4 ? ;
N = 4,
X = 5 ? ;
no
...