Я также собираюсь предположить, что sublist / 3 должен вычитать число из всех элементов в списке.
Причина, по которой вы не получаете никакого результата для Z, заключается в том, что вы строите список на пути к рекурсии. Это означает, что, когда предикат остановки завершается успешно, Пролог работает, выходя из рекурсии, и Z снова становится необработанным.
Z is ?
|
Z is [-1]
|
Z is [-1, 0]
|
Z is [-1, 0, 1]
|
Z is [-1, 0]
|
Z is [-1]
|
Z is ?
Попробуйте сначала войти в рекурсию и составить свой список на выходе. Может быть так:
subtract_list(_, [], []).
subtract_list(Number, [Head|Tail], [Subtracted|Result]):-
subtract_list(Number, Tail, Result),
Subtracted is Head - Number.
Все, что мы изменили, - это порядок правил в рекурсивном предикате и условия условия остановки. Теперь он повторяется до тех пор, пока не достигнет пустого списка, после чего он создает экземпляр переменной результата с пустым списком. Затем он снова создает пузыри, добавляя значения в список.
?- subtract_list(1,[4,3,2],Z).
Z = [3, 2, 1]
Надеюсь, это поможет. Том