Прежде всего, какой пролог вы используете, чтобы получить эти результаты? Похоже, у вас включен отладчик или что-то. Я настоятельно рекомендую SWI-Prolog , который дает правильные результаты.
Что касается наименования дисков, да, вы можете сделать это. Рассмотрим что-то вроде этого:
move([Disc],X,Y,_) :-
write('Move disk '),
write(Disc),
write(' from '),
write(X),
write(' to '),
write(Y),
nl.
move([Bottom|Rest],Start,Swap,Goal) :-
move(Rest,Start,Swap,Goal),
move([Bottom],Start,Goal,_),
move(Rest,Swap,Goal,Start).
Когда вы запустите move([biggest,middle,smallest], left, center, right).
, вы получите следующие результаты:
Move disk smallest from left to center
Move disk middle from left to right
Move disk smallest from center to right
Move disk biggest from left to right
Move disk smallest from center to right
Move disk middle from center to left
Move disk smallest from right to left
Хитрость в том, что это восходящий алгоритм. По сути это сводится к:
- Переместить все поверх нижнего диска в своп (что является рекурсивным шагом)
- Переместить нижний диск к цели
- Переместить все остальное от свопа к цели
Поскольку это снизу вверх, вы должны указать список, начиная с самого нижнего диска.