Ваше определение reverseList/2
использует T
в качестве хвоста обратного списка.Перевернутый список создается и печатается на самом глубоком уровне рекурсии, а затем с этим созданным значением ничего не делается:
2 ?- reverseList( [1,2,3,4], [0]).
[4,3,2,1,0]
<b>true</b>.
Вместо этого передайте его как свежую логическую переменную в качестве третьего параметра passон остается неизменным между вызовами и, наконец, устанавливает его на самом глубоком уровне:
reverseList([], List, T) :- <b>List = T</b>, write(List), nl.
reverseList([H | Old], [], T) :- reverseList(Old, [ H ], T).
reverseList([ H | Old], New, T) :- reverseList(Old, [ H | New], T).
Затем назовите его как reverseList( [1,2,3,4], Newtail, T)
, чтобы установить T
на самом глубоком уровне рекурсии:
6 ?- reverseList( [1,2,3,4], [0], T).
[4,3,2,1,0]
T = [4, 3, 2, 1, 0].
Определение повсеместно, наименование ужасное, и оно использовало T
, вероятно, для "хвоста", поэтому вы должны назвать новый аргумент как-то вроде R
, чтобы, по крайней мере, намекнуть натот факт, что он будет содержать перевернутый список как результат вызова.