我正试图找出CS家庭作业的这个问题(我将它标记为作业,我只需要朝着正确的方向迈出一步)。编辑:显然'家庭作业'标签已经过时,不再使用。无论如何,我必须在Prolog中编写一个规则定义,确定给定的移动列表可以解决塔。我知道指示很糟糕,我的教授很不清楚,但我所拥有的是必须满足以下条件:
?- hanoi(1,l,c,r,[[l,r]]).
true.
?- hanoi(1,l,c,r,[[c,r]]).
false.
?- hanoi(2,l,c,r,[[l,c],[l,r],[c,r]]).
true.
?- hanoi(3,l,c,r,M).
M = [[l,r], [l,c], [r,c], [l,r], [c,l], [c,r], [l,r]].
我没有丝毫的线索,上面的任何内容应该暗示我这样做,所以任何指导都将不胜感激!它不会让我这样标记,但就像我说的那样,这是一个功课问题(虽然看起来很荒谬,考虑到缺乏解释),所以我不一定想要一个我想要的答案准确理解发生了什么。
非常感谢你们!
答案 0 :(得分:2)
假设你知道问题是什么,这就是代表的含义:
hanoi(1,l,c,r,[[l,r]]).
这显然意味着在初始状态下左塔上有一个元素。 l,c和r是塔的名称。最后一个论点是解决方案。 解决方案是一系列动作。每一步都是一对[你从哪里得到元素,你把它放在哪里]。因此,在前一个原子中,编制的解决方案是:将左塔上的元素移动到右塔。
hanoi(1,l,c,r,[[c,r]]).
这失败了,因为解决方案是错误的。初始状态只有左塔上的元素,所以如果它不在那里你就不能从中央塔移动它。
hanoi(2,l,c,r,[[l,c],[l,r],[c,r]]).
这是通过三个动作解决的:左到中,从左到右,从中到右。最后一个查询也是一样。