Я пытаюсь понять списки Пролога и как 'возвращаются'/создаются значения в конце рекурсивной функции.
Я смотрю на этот простой пример:
val_and_remainder(X,[X|Xs],Xs).
val_and_remainder(X,[Y|Ys],[Y|R]) :-
val_and_remainder(X,Ys,R).
Если я позвоню val_and_remainder(X, [1,2,3], R).
тогда я получу следующие выводы:
X = 1, R = [2,3];
X = 2, R = [1,3];
X = 3, R = [1,2];
false.
Но я не совсем понимаю, почему в базовом случае (val_and_remainder(X,[X|Xs],Xs).
) Xs
должен появляться так, как он есть.
Если бы я должен был вызвать val_and_remainder(2, [1,2,3], R).
тогда мне кажется, что он будет проходить через программу как:
% Initial call
val_and_remainder(2, [1,2,3], R).
val_and_remainder(2, [1|[2,3]], [1|R]) :- val_and_remainder(2, [2,3], R).
% Hits base case
val_and_remainder(2, [2|[3]], [3]).
Если вышеуказанный прогон корректен, то как получить правильное значение для R
? Как и в приведенном выше случае, значение R должно быть R = [1,3]
.