河内之谜(prolog)

时间:2009-04-13 19:36:46

标签: prolog towers-of-hanoi

每个人都知道着名的河内序言

你可以找到它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。

2 个答案:

答案 0 :(得分:3)

首先,您使用什么Prolog来获得这些结果?看起来你启用了调试器或其他东西。我强烈推荐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

这里的诀窍是这是一个自下而上的算法。基本上它归结为:

  1. 将底部光盘顶部的所有内容移动到交换(这是递归步骤)
  2. 将底部光盘移至目标
  3. 将其他所有内容从交换移至目标
  4. 因为它是自下而上的,所以你必须从最底部的光盘开始给出列表。

答案 1 :(得分: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下检查。