3

我正在尝试通过 Prolog CLP FD 使用限制编程来解决提出的难题。这个谜题包含以下简单规则:

阴阳谜题说明

现在,在我的代码中,我已经涵盖了 2x2 网格的限制,并且必须将其中一个连接到至少一个相同颜色的网格。

问题是我找不到一种方法来建立限制,即一件必须有一个路径(连接)到所有其他相同颜色的部分,而不通过相反颜色的部分,所以我得到了这种输出:

0 0 0 0
0 1 0 1
0 1 0 1
0 1 0 0

0 0 0 0
0 1 0 1
0 1 0 1
0 1 0 1

其中 1 并非全部相互连接。

如何在 CLP FD 中编写这种图形限制?

编辑:我正在使用 SICStus Prolog。

4

2 回答 2

2

改写您的情况,以便我们可以更清楚地考虑它:

  1. 您已经可以生成答案
  2. 目前的答案过于笼统

为了使您的程序更具体,您必须找到当前在您生成的答案之一中违反的条件,但该条件必须在每个解决方案中都成立,然后用约束条件表达该条件。

例如,再次考虑您的情况:

0 0 0 0
0 1 0 1
0 1 0 1
0 1 0 1

这里违反了哪个条件?显然,这些1碎片不是沿着一条路径。但是用 CLP(FD) 描述一条完整的路径是非常乏味的,而且由于这显然取自考试或家庭作业问题,因此这个想法本身表明存在一个简单的局部标准来表达所需的条件。

通过“本地”,我的意思是你只需要考虑几个邻居而不是整个董事会。

所以,再次考虑1碎片。显然,每1一块都有一个 在这个答案中也是1 的邻居。还有什么?每1一块有2 个邻居吗?目前没有,没有。每件作品都应该1有两个邻居 1吗?如果不是,有多少例外是可以接受的?

如果你按照这些条件思考,你肯定会得到一个很好的解决方案。

一个提示:有时具体化的约束在此类任务中很有用。这意味着您可以例如说:B #<==> (X #= Y)和 letB表示是否 X #= Y 成立。请注意,在这种情况下,您甚至可能不需要它。

于 2016-12-20T20:28:10.917 回答
0

你们中的任何一个最后解决了这个问题吗?

我对这个问题很感兴趣,想看看代码,如果存在的话。

我认为 circuit/1 无济于事,想看看解决这个问题的用法。

于 2018-03-02T17:14:19.427 回答