このディレクトリの索引
#  ハノイの塔(N個盤,_履歴)
#  どの柱からどの柱に動かそうとしているかは、ほとんどの場合、ハノイの塔/5の
#  第一節、すなわち盤が一枚の時、どの位置からどの位置へ動かそうとしているかで
#  判ります。
#  
#  もし、左から中の柱へ移動したい場合でも、修正箇所は少なく、
#  _左 からの移動場所が _右 から _中に変わることと、
#  ハノイの塔/5の第二節本体の第二副目標の
#  「第一引数にはワーク柱が」
#  「目標柱が本来の位置」に書かれる必要があります。
#  
#  しだかって、ハノイの塔/5の第二節本体の第二副目標は
#  右に集める時は第一引数が_中、第三引数が_右。
#  中に集める時は第一引数が_右、第二引数が_中。
#  
#  ハノイの塔の丁寧な説明は Prolog(プロログ)を学ぶ―文化とその実践 杉崎昭生著 p133-137にあります。

%%%%%%%%%%%%%%%% 左柱 から 右柱 へ の移動 %%%%%%%%%%%%%%%%%%%

:- op(500,xfx,から).
:- op(400,xf,へ).

ハノイの塔(N,_移動履歴) :-
        length(Ln,N),
        ハノイの塔(Ln,左柱,中柱,右柱,_移動履歴).

ハノイの塔([_],_左,_中,_右,[_左 から _右 へ]).
ハノイの塔([_|Ln],_左,_中,_右,_移動履歴) :-
        ハノイの塔(Ln,_左,_右,_中,_移動履歴_1),
        ハノイの塔(Ln,_中,_左,_右,_移動履歴_2),
        append(_移動履歴_1,[_左 から _右 へ|_移動履歴_2],_移動履歴).

%%%%%%%%%%%%%%%% 左柱 から 中柱 へ の移動 %%%%%%%%%%%%%%%%%%%

:- op(500,xfx,から).
:- op(400,xf,へ).

ハノイの塔(N,_移動履歴) :-
        length(Ln,N),
        ハノイの塔(Ln,左柱,中柱,右柱,_移動履歴).

ハノイの塔([_],_左,_中,_右,[_左 から _中 へ]).
ハノイの塔([_|Ln],_左,_中,_右,_移動履歴) :-
        ハノイの塔(Ln,_左,_右,_中,_移動履歴_1),
        ハノイの塔(Ln,_右,_中,_左,_移動履歴_2),
        append(_移動履歴_1,[_左 から _中 へ|_移動履歴_2],_移動履歴).


%  代表的なハノイの塔