【问题标题】:Prolog - Towers of HanoiProlog - 河内塔
【发布时间】:2014-10-17 06:40:57
【问题描述】:

我正在尝试编写一个程序来解决 Prolog 中的河内塔问题。这里的帖子都没有帮助我,所以我决定自己问。我已经编写了以下代码。它适用于 2 个磁盘,但会进入 3 个无限循环。

hanoi(1,A,B,_,[(A,B)]).
hanoi(X,A,B,C,Y):-
  hanoi(X2,A,C,B,Y1),
  hanoi(1,A,B,_,[Y2]),
  hanoi(X2,C,B,A,Y3),
  append(Y1,[Y2|Y3],Y),
  X2 is X-1.

调用方式如下:

?- hanoi(3, a, b, c, Y).

a,b,c 是钉子。 3 是磁盘的数量,X 是我们想要的结果。

我需要在 Y 中得到结果。我正在尝试使用 2 递归地找到 X-1 圆盘从 peg 1 到 3 的移动,1 个圆盘从 peg 1 到 2,X-1 圆盘从 peg 3 到2 并附加它们。我不明白我做错了什么。任何帮助或指导将不胜感激!谢谢!

【问题讨论】:

  • 这些参数是什么意思?哪些必须实例化为什么类型的术语?或者:告诉我们你如何称呼这个谓词。

标签: prolog towers-of-hanoi


【解决方案1】:

明显的问题-

当你有连词时,比如:

a, b, c

您对此有两种解读,逻辑上的和程序上的。合乎逻辑的解读是:

“如果a 为真,b 为真,c 为真,则连词为真。”

程序解读是:

“如果a 被评估并成功,则连接将成功,然后b 被评估并且它也成功,然后c 被评估并且它也成功。” (或者,换句话说,对解空间进行深度优先搜索)

如果你足够细心,程序性阅读没有必要争论你的代码。但是,只有当连词中的所有子目标都与逻辑和程序阅读完全重叠时,才会出现这种情况。

这里的罪犯是is/2。它没有纯粹的逻辑意义。它计算右侧操作数(算术表达式)并将结果与​​左侧操作数(通常是未绑定的变量)统一。

在这里,您有一个连词(在第二个子句的主体中),实际上是“评估a(X),然后,如果成功,则找到X 的值”。明显的问题是a(X) 要求以终止的方式评估X 的值。

因此,将is 移到所有使用其结果的子目标之前,或者考虑使用约束。

【讨论】:

  • 非常感谢!你的解释很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多