перемещение по списку

Изучая это очень медленно ... сегодня получил несколько книг, и они просто отстой ...

Итак.. Я пытаюсь переместить позицию X по списку.. затем вернуть оставшуюся часть списка. Проблема в том, что я возвращаю просто элемент в этой позиции, а не список. Я считаю, что моя проблема либо в базовом случае, либо в неизвестной переменной. Я также не уверен на 100%, когда следует использовать «_».

объяснение было бы чрезвычайно полезно .. спасибо заранее.

move([X|_],0,X).
move([X|XS],K,L) :- K>0,
    K1 is K-1, move(XS,K1,L).

person DJPlayer    schedule 22.04.2011    source источник
comment
Я считаю, что move — довольно вводящее в заблуждение название этой операции. Я бы назвал это, например. получить_хвост/3.   -  person Kaarel    schedule 23.04.2011
comment
@Kaarel: идиоматическое имя для этого предиката — nth_tail.   -  person Fred Foo    schedule 24.04.2011


Ответы (1)


Базовый вариант должен быть move(X,0,X).

move([X|_],0,X) объединит X с единственным элементом во главе списка.

person Nick Main    schedule 22.04.2011
comment
так что _ говорит, что хвост присутствует... но не используется? Таким образом, использование термина X, который представляет собой весь список без разбиения на голову и хвост? - person DJPlayer; 23.04.2011
comment
точно - X сам по себе не делает заявлений о том, с чем он будет сопоставляться, и поэтому будет унифицирован со всем списком. Шаблон [X|_] разрушит структуру списка и заставит X унифицироваться с заголовком. - person Nick Main; 23.04.2011