问题标签 [eclipse-clp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
169 浏览

prolog - 如何在 eclipseCLP prolog 中使用 clpfd(无 eclipse java IDE)

我正在尝试使用eclipseclp在 prolog 中使用 CLP 制定一个简单的路线计划, 并且我想使用 clpfd prolog 库,但编译器无法识别它们。我收到此错误:

我已经安装了eclipseCLP的所有第三方库,但我无法解决这个问题。

0 投票
1 回答
247 浏览

prolog - 元组的不同之处

我试图以每个数字都有 9 个位置的观点来解决数独问题。这是我的数独的表示:

数独

从表格中您可以看到数字5在数独中具有以下位置 (Row,Col):(2,8),(4,2),(6,5)。

当我在解释中提到一行时,我的意思是这样的一行: 排

例如,上面的 是第1行。

我所做的如下:

  • alldifferent对于每一行,使用from检查该行中的所有 ROW 值是否不同ic_global
  • 执行与上述相同的操作,但随后针对 COLUMN-Values。
  • 对于每一行,检查平方数是否不同(每次使用 row 和 col 值计算),alldifferent再次使用。

上述工作正常,我得到了数独的解决方案,但不是正确的解决方案。这是因为我必须再检查一件事:每个位置都必须不同。使用我的求解器的当前状态,我可以获得一个在同一位置具有多个数字的解决方案,fe: 23都可能位于位置(5,7),因为我不检查所有位置是否不同。

我将如何解决这个问题?我试图以元组形式在一个列表中获取所有位置,然后检查所有元组是否不同,但我已经挣扎了几个小时,我真的很绝望。我希望我能在这里找到解决方案。

编辑:添加代码

代码

0 投票
1 回答
131 浏览

prolog - 下标是如何工作的?

在第一张图片中,我使用以下方法获取数组的第一个元素:

返回_一个

在第二张图片中,我尝试了相同的方法,但随后对第二个元素进行了尝试,但它获取了从第二个元素到数组末尾的所有内容。我只想要第二个元素而不是其余元素。

返回休息

下标究竟是如何工作的?

0 投票
1 回答
247 浏览

list - 列表 ECLiPSe clp 上的简单算术约束

我想对列表的所有值做一个简单的约束,我希望数组每一行的每个索引都具有以下(ic)约束:

500 #= 2^X1 + 2^X2 + 2^X3 + ... + 2^X9

我尝试执行下面的代码。数组是一个 9x9 矩阵,对于每一行,我都希望满足上述约束。但是,这似乎不起作用,程序没有找到任何满足约束的可能值。

0 投票
1 回答
385 浏览

prolog - 如何在 Prolog 中检查子矩阵的元素

我正在尝试在 EclipsE Prolog 中编写 Shikaku 求解器。我的约束定义如下:

注释中的行应检查从 L..R - T..B 发出的子矩阵是否仅包含等于 ID 的元素。如何才能做到这一点?

运行它会给出“_3264{1 .. 3} =< 3 中的实例化错误”

编辑1:完整代码

edit2 似乎 Eclipse 无法减少 LR/TB 变量的域以应用实例化。这是一个正确的假设吗?如果是这样,这将如何解决?

0 投票
0 回答
101 浏览

prolog - 求解 CSP 时启发式的奇怪行为

考虑以下难题:

数仓

一个单元格被标记或未标记。谜题右侧和底部的数字表示特定行或列的总和。单元格对其行和列中的总和有贡献(如果标记):位置中的单元格对列总和和行总和(i,j)有贡献。比如上图的第一行,标记了第 1、2、5 个单元格。这些对行总和有贡献(因此总共有 8 个),对它们的列总和贡献了 1。ij1 + 2 + 5

我在 ECLiPSe CLP 中编写了一个求解器。它工作得很好,但是对于不同的值/变量选择方法,它表现出非常奇怪的行为,我不知道为什么。(注意:拼图中的每个字段都是域 [0,1] 的决策变量,标记为 1,否则为 0。约束是显而易见的。)

如果我使用 input_order(请参阅search/6)、first_fail、occurrences 或 max_constrained,则几乎可以立即解决难题,而内存使用量很少。如果我使用最大或最小的 anti_first_fail,拼图可能需要几分钟才能完成,并且可能会占用 16GB 内存。为什么?为什么大多数约束对这些方法保持有效这么长时间?

为什么最小和 first_fail 之间有区别?如果域仅包含 2 个元素,并且所有变量具有相同的域,那么 first_fail、anti_first_fail、最大、最小和 most_constrained 应该是等价的,不是吗?删除域中的一个值会将单个值附加到该变量,因此不需要更多的传播。因此,在这种情况下,搜索将始终处理其域恰好包含 2 个项目的变量。不?

0 投票
1 回答
182 浏览

prolog - ECLiPSe CLP 中的自定义启发式

考虑以下难题:

数仓

一个单元格被标记或未标记。谜题右侧和底部的数字表示特定行或列的总和。单元格对其行和列的总和有贡献(如果标记):位置 (i,j) 的单元格对列总和贡献 i,对行总和贡献 j。比如上图的第一行,标记了第 1、2、5 个单元格。这些对行总和贡献 1 + 2 + 5(因此总计 8),对它们的列总和贡献 1。

我在 ECLiPSe CLP 中有一个求解器来解决这个难题,我很想为它编写一个自定义启发式算法。

我认为最容易开始的单元格是那些列和行提示尽可能低的单元格。一般来说,值越低,写为 1 和 之间的自然数之和的N可能性就越小。在这个谜题的上下文中,这意味着具有最低的单元格出错的可能性最低,因此回溯更少。NNcolumn hint + row hint

在实现中,我有一个NxN代表棋盘的数组,以及两个代表提示的大小为 N 的列表。(侧面和底部的数字。)

我看到两个选项:

  • 为search/6编写一个自定义选择谓词。但是,如果我理解正确的话,我只能给它2个参数。没有办法计算给定变量的行+列总和,因为我需要能够将它传递给谓词。我需要4个参数。

  • 忽略 search/6 并编写自己的标记方法。这就是我现在的方式,请参见下面的代码。

它采用棋盘(NxN包含所有决策变量的数组)、提示列表并返回包含所有变量的列表,现在根据它们的行 + 列总和进行排序。但是,如您所见,这可能不会变得更麻烦。为了能够排序,我需要将总和附加到每个变量,但为了做到这一点,我首先需要将其转换为还包含所述变量坐标的术语,以便我转换回变量为排序完成后...

最后,这种启发式方法几乎不比 input_order 快。我怀疑这是因为它的实施方式很糟糕。关于如何做得更好的任何想法?或者我认为这种启发式应该是一个巨大的改进是不正确的?

0 投票
1 回答
789 浏览

constraints - ECLiPSe CLP 中的主动与被动约束

ECLiPSe CLP 语言中的主动约束和被动约束有什么区别?以及如何/何时可以使用其中一种?

0 投票
0 回答
122 浏览

prolog - ECLiPSe CLP:缓慢的组合出现/3 约束行为

作为一个更大问题的一个子集,我正在尝试为 NxN 板(包含 N² 个单元)编写以下 2 个约束:

  • 每行/列包含由预定义提示给出的整数 K 的 N 次出现
  • 没有 2x2 块(板上的任何地方)包含超过 1 次出现的整数 K

在板上,已经预先填充了几个单元格,对于这个 SO 问题中的约束应该忽略,因此我们使用整数 2 来表示这些单元格并将未知单元格建模为具有二进制布尔值的有限域:

代码中的约束分别为:

对于一个简单的拼图执行:

对于 8x8 拼图,几乎可以立即找到第一个解决方案:

但是,对于 20x20 实例,我让它运行了大约 5 分钟而没有得到任何结果。

为了调查一个约束是否会比另一个更昂贵,我分别运行了它们:

当我们使用 hint_constraints/4 而不是 block_constraints/2 时,我们得到:

并且可以验证是否满足所有行/列的出现。反过来,当我们使用 block_constraints/2 而不是 hint_constraints/2 时:

我们可以再次验证 2x2 块约束是否成功成立。不幸的是,当同时使用这两个约束时,程序似乎不会在 5 分钟内完成。我对这种行为有点困惑,因为这两个约束分别看起来工作得非常快。虽然我知道必须在内部进行大量检查以确保每个行/列的正确出现,同时在整个过程中仍然满足块约束,但它需要超过 5 分钟的事实让我认为必须做其他事情我编写块约束的方式有误。

有谁知道如何优化我的块出现约束的实现?

提前致谢!

拼图实例

谜题(8,简单,[1,2,1,1,1,3,1,2], [2,1,1,1,3,0,3,1], [1-8, 2-1 , 2-4, 2-8, 5-5, 6-1, 6-2, 6-6, 6-8, 7-2, 7-4, 7-7])。

拼图(20,中,[5,2,6,2,7,1,6,3,5,4,5,3,4,2,4,3,5,4,4,5], [5 ,4,3,3,6,3,4,5,2,4,4,4,2,7,1,5,3,6,3,6], [1-6, 1-15, 2 -3、2-6、2-8、2-14、2-18、2-19、3-1、3-5、3-11、4-8、4-9、4-11、4-19 , 4-20, 5-6, 5-9, 5-15, 5-16, 5-19, 6-1, 6-11, 6-15, 7-1, 7-6, 7-15, 8 -5、8-10、8-15、8-18、9-1、9-10、9-13、9-15、9-17、9-20、10-1、10-7、10-17 , 10-19, 11-5, 11-7, 11-11, 11-13, 11-20, 12-5, 12-18, 13-6, 13-11, 13-18, 14-1, 14 -5、14-6、14-10、15-3、15-12、16-6、16-13、16-17、16-18、16-19、17-2、17-5、17-7 , 17-15, 18-3, 18-9, 18-10, 18-12, 18-18, 19-1, 19-6, 19-20, 20-3, 20-9, 20-11, 20 -12、20-15、20-19])。

0 投票
3 回答
1248 浏览

prolog - 示例通道约束 ECLiPSe

有人可以提供一个简单的通道约束示例吗?

通道约束用于组合约束问题的观点。约束编程手册很好地解释了它的工作原理以及它为什么有用:

搜索变量可以是其中一个视点的变量,比如 X1(这将在下面进一步讨论)。随着搜索的进行,传播约束 C1 会从 X1 中变量的域中删除值。然后,通道约束可以允许从 X2 中变量的域中删除值。使用第二个模型 C2 的约束传播这些值删除可能会从这些变量中删除更多值,并且这些删除可以再次通过通道约束转换回第一个视点。最终结果可能是,在视点 V1 中删除的值比仅通过约束 C1 删除的值更多,从而导致搜索减少。

我不明白这是如何实现的。这些约束到底是什么,它们在实际问题中看起来如何?一个简单的例子会很有帮助。