Сначала давайте дадим предикату более описательное имя, скажем, 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