2009-04-13 9 views
4

一人一人が、有名なハノイのプロローグタワーズ(プロローグ)

を知って、あなたが見つけることができるそれHERE

とその偉大なしかし、私はこのクエリの動きを書くとき(3、左、右、中央) 。私が得たもの

そのが表示されていないこれらの結果

Move top disk from left to right 
Move top disk from left to center 
Move top disk from right to center 
Move top disk from left to right 
Move top disk from center to left 
Move top disk from center to right 
Move top disk from left to right 

は、私はそれがより良い方法で結果を印刷させることができ、そしてとてもディスクに名前を付けることが可能であるか

Trace: >> RETURN: nl() 
Trace: >> RETURN: hanoi(1,left,right,center) 
Trace: >> RETURN: hanoi(2,center,right,left) 
Trace: >> RETURN: hanoi(3,left,right,center) 
True 
1 Solution 

そうですプログラムは次のように結果を表示するように私に名前を付けます。 "ディスクAを左から右に移動"

申し訳ありませんが、私はたくさんお願いしますが、私はPROLOGが大好きです。

答えて

3

まず、Prologがこれらの結果を得るために使用しているのは何ですか?デバッガが有効になっているかのようです。私は正しい結果を与えるSWI-Prologを強くお勧めします。

ディスクに名前を付ける場合は、可能です。ここでのトリックはこれがボトムアップアルゴリズムであるということである

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 

:あなたはmove([biggest,middle,smallest], left, center, right).を実行すると、あなたがこのような結果が得られます

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). 

:このような何かを考えてみましょう。

  • がへのスワップからゴールまで、他
  • 移動すべてを下のディスクを移動します(再帰的ステップがある)スワップに

    1. 移動下のディスクの上にすべてを:基本的にそれはつまるところ目標

    ボトムアップなので、一番下のディスクから始める必要があります。

  • +0

    Thanx A Lot、私はPIE(Prolog Inference Engine)を使用していますが、答えを正しく表示していません。私はSWIをダウンロードしようとしますが、PIEを使い続けて同じ結果を得る方法はあります –

    +0

    はい。あなたには痕跡があります。オフにすると、正しい結果が得られます。 [Trace]アイコン([一時停止]の横にあるDVDプレーヤーのイジェクトボタンのように表示されます)をクリックするか、[エンジン] - [トレース呼び出し]をクリックします。 SWI-Prologは友好的ではないかもしれませんが、はるかに強力です。 – Pesto

    +0

    また、format/2:format( "ディスクを〜wから〜w \ n"、[ディスク、X、Y]に移動する)も検討してください。 – mat

    0

    私は編集がピアレビューされるのが永遠になると思うので、ここで訂正します。 Pestoが投稿したコードにはバグがあります。正しいバージョン(よりきれいな出力形式で)は次のようになります。

    move([Disc],X,_,Y) :- 
        format("Move disk ~w from ~w to ~w\n", [Disc, X, Y]). 
    move([Bottom|Rest],Start,Swap,Goal) :- 
        move(Rest,Start,Goal,Swap), 
        move([Bottom],Start,_,Goal), 
        move(Rest,Swap,Start,Goal). 
    

    GNU Prologでチェックしてください。