问题标签 [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.
arrays - 如何将向量转换为 ECLiPSe (CLP) 中的数组?(或序言)
我必须以包含 9 个向量(每个长度为 9)的向量格式解决数独难题。鉴于向量是 Prolog 中的链表,我认为如果我首先将拼图转换为 2D 数组格式,搜索会更快。
示例拼图:
我正在使用 ECLiPSe CLP 来实现求解器。到目前为止,我想出的最好的方法是编写一个这样的域:
和一个用于拼图的转换器(参数 P 是给定的拼图,Sudoku 是带有二维数组的新定义的网格)。但是我无法将给定初始拼图的值链接到我的二维数组。
在此之前,我尝试使用 array_list ( http://eclipseclp.org/doc/bips/kernel/termmanip/array_list-2.html ),但我不断收到类型错误。我之前是怎么做的:
当我的数独最终以以下格式输出示例拼图 P 时:
那么我会很开心。
更新
我再次尝试使用 array_list;它几乎适用于以下代码:
那里的写入是为了查看向量/数组的外观。由于某种原因,它在第二次迭代(而不是 9 次)处停止,并将示例拼图的其余部分作为向量的向量输出。只有第一个向量被正确分配。
更新2
虽然我确定 jschimpf 给出的答案是正确的,但我也想出了自己的实现:
感谢您对为什么它以前不起作用的补充解释!
performance - 测量执行时间 ECLiPSe CLP(或 Prolog)
如何测量 ECLiPSe CLP 中方法的执行时间?目前,我有这个:
我需要写下执行方法solve_traditional(...)所花费的时间并将其写入文本文件。但是,它不够精确。对于给定的方法,有时时间会打印 0.015 或 0.016 秒,但通常会打印 0.0 秒。
考虑到方法完成太快,我决定使用统计信息(运行时,...)来测量两次运行时调用之间所花费的时间。例如,我可以测量完成 20 次方法调用所需的时间,并将测量的时间 T 除以 20。
唯一的问题是,对于 20 次调用,T 等于 0、16、32 或 48 毫秒。显然,它分别测量每个方法调用的时间并找到执行时间的总和(通常只有 0.0 秒)。这超出了测量 N 个方法调用的运行时间并将时间 T 除以 N 的全部目的。
简而言之:我用于执行时间测量的当前方法是不够的。有没有办法让它更精确(例如 9 位小数)?
prolog - ECLiPSe CLP 拼图:完美的矩形拟合
我正在研究一个名为“除以盒子”的谜题。本质上,它是一种基于给定线索的完美矩形拟合形式。规则是:
- 一些网格单元包含数字(这是已知的输入数据)
- 任务是将网格区域划分为满足以下约束的矩形房间:每个房间恰好包含一个数字,并且房间的总面积等于其中的数字
例如:
有解决方案:
我已经编写了约束和一个小型有限域求解器,它可以有效地为每个提示提供所有可能的矩形放置,如下所示(坐标从 (1,1) 开始并从左上角移动到右下角):
我随后尝试编写我自己的求解器,它基于检查重叠约束(即如果两个矩形水平重叠,它们不应该垂直重叠,反之亦然)。它适用于小谜题,但是,由于广泛的约束检查,我的两次尝试都没有成功地扩展到大于 ~ 15x15 的谜题。
因此,我们的目标是找到一个可以扩展到更大的谜题的模型,并且如果可能的话,以这样一种方式可以使用 ECLiPSe 的内置 search/6 并能够轻松地尝试不同的搜索启发式。
有什么想法/想法吗?提前致谢!
注意:我正在使用整数 IC 域库 (= lib(ic))
(编辑他们现在都在不到半秒的时间内解决,以防有人对运行时间结果感兴趣)
问题输入数据:
语法:问题(ID,宽度,高度,提示)(提示是三元组:(I,J,Value))
问题(p(15,1),15,15,[(9,1,4),(11,1,2),(12,1,3),(14,1,3),(2,2 ,4),(3,2,2),(4,2,2),(8,2,12),(2,3,3),(10,3,3),(1,4,2 ),(10,4,11),(15,5,7),(8,7,36),(12,8,24),(3,9,27),(13,9,24), (15,9,7),(4,11,3),(8,11,2),(7,12,6),(8,12,2),(7,13,3),(8 ,13,2),(10,13,3),(4,14,7),(9,14,3),(10,14,2),(11,14,2),(12,14) ,6),(6,15,8)])。
问题(p(15,2),15,15,[(1,1,9),(11,1,2),(13,1,2),(7,3,36),(13,4 ,3),(14,4,16),(1,6,2),(7,6,24),(4,7,3),(6,7,8),(2,8,6 ),(3,8,3),(9,8,7),(7,9,9),(15,9,5),(1,10,5),(3,10,2), (11,10,16),(14,10,5),(1,12,2),(4,12,2),(6,12,3),(10,12,6),(11 ,12,2),(3,13,3),(7,13,2),(12,13,5),(13,13,7),(1,14,2),(14,14 ,26),(15,14,2)])。
问题(p(20,1),20,20,[(2,1,2),(4,1,2),(11,1,4),(13,1,2),(1,2 ,2),(5,2,12),(9,2,35),(16,3,15),(19,3,20),(1,4,2),(1,5,2) ),(4,6,8),(20,6,5),(14,7,2),(3,8,10),(10,8,5),(1,10,4), (5,11,30),(15,13,60),(7,14,24),(12,14,54),(14,14,13),(9,15,54),(1 ,16,8),(16,18,6),(17,18,3),(19,18,2),(20,18,8),(20,19,3),(18,20 ,3)])。
问题(p(20,2),20,20,[(3,1,3),(6,1,2),(8,1,4),(2,2,2),(4,2 ,4),(9,2,3),(16,2,15),(17,2,3),(18,2,6),(11,3,2),(19,3,2) ),(20,3,3),(1,4,4),(5,4,7),(9,4,2),(17,4,7),(19,4,2), (4,5,5),(9,5,2),(10,5,3),(12,5,9),(1,6,2),(2,6,2),(7 ,6,18),(2,7,2),(10,7,2),(13,7,20),(1,9,20),(20,9,3),(4,10 ,3),(11,10,45),(15,12,28),(19,12,2),(20,12,2),(5,13,2),(8,13,3 ),(15,13,40),(6,14,2),(9,14,12),(3,15,14),(5,15,4),(6,15,6), (18,15,18),(3,16,2),(4,16,6),(5,18,3),(14,18,15),(17,18,2),(3 ,19,2),(5,19,4),(10,19,2),(2,20,6),(5,20,3),(6,20,2),(8,20 ,3),(16,20,2),(17,20,2),(20,20,6)])。
问题(p(25,1),25,25,[(2,1,2),(11,1,10),(15,1,8),(17,1,8),(24,1 ,2),(13,2,2),(14,2,2),(3,3,6),(12,3,32),(25,3,2),(2,4,2 ),(4,4,2),(14,4,2),(24,4,8),(25,4,2),(4,5,3),(14,5,4), (13,7,2),(1,8,18),(18,8,56),(21,9,6),(22,9,3),(25,9,4),(2 ,10,6),(19,10,18),(24,10,4),(10,11,60),(14,11,10),(15,11,4),(23,11 ,3),(2,12,2),(4,12,5),(10,12,4),(22,12,2),(23,12,3),(24,12,6 ),(6,13,15),(19,13,2),(21,13,2),(2,14,2),(5,14,28),(17,14,3), (20,14,3),(22,14,2),(18,15,3),(21,15,5),(7,16,7),(12,16,3),(15 ,16,3),(16,16,2),(9,17,2),(11,17,2),(17,17,3),(20,17,16),(7,18 ,12),(8,18,2),(9,18,3),(12,18,4),(13,18,9),(19,18,12),(24,18,2) ),(25,18,3),(1,19,2),(5,19,9),(11,19,2),(3,20,2),(5,20,5), (9,20,2),(20,20,7),(7,21,24),(18,22,6),(20,22,3),(21,22,10),(4 ,23,6),(5,23,3),(7,23,9),(10,23,12),(16,23,24),(17,23,4),(24,23) ,5),(1,24,2),(18,24,8),(25,24,2),(2,25,4),(17,25,11)])。
eclipse-clp - ECLiPSe CLP 类型错误?
我正在尝试在 ECLiPSE CLP 中获取数独板的尺寸,但是出现以下错误:
我打电话时得到这个dim(Board,[R,C])
,其中 Board 是数独板:
有人知道为什么会这样吗?
prolog - ECLiPSe clp:获取网格上的所有相邻单元格
所以我的问题如下:我想,给定网格中 X,Y 坐标的某个点,返回其所有相邻的单元格。
(注意:在以下示例中,我使用符号 UL = 左上角,UM = 上中,UR = 右上,L = 左,R = 右,BL = 左下,BM = 下-中间和 BR = 右下角。)
例如:
对于 5x5 网格上 (3,3) 处的元素 x
对于 5x5 网格上 (1,1) 处的元素 x
现在,从上面的示例中可以看出,与当前元素 x 相邻的单元格数量可能会根据元素 x 本身的 X、Y 坐标而变化。
我想通过说指定坐标 X 左右的每个 X 以及指定坐标 Y 上方和下方的每个 Y 都应该在 1..N 的域中来解决这个问题,然后定义它们的实际值:
但是,当然,只要越过棋盘的边界,这就会评估为假。
我希望我不需要明确区分有关董事会边界的情况;相反,我试图找到一些东西,而不是在达到越界坐标时评估为假,只是“丢弃”该结果并尝试计算其他相邻单元格。
我确信在 ECLiPSe 中会有一个很好的小解决方案,但我已经搜索了文档并且 - 到目前为止 - 似乎无法找到适合我需要的东西。
任何帮助是极大的赞赏!
prolog - 3-in-a-row 逻辑谜题:优化列表/数组中的序列约束
在下面的谜题中,我们尝试用蓝色和白色方块填充网格,如下所示:
- 不允许使用相同颜色的 3 行(或列)。
- 每一行和每一列都有相同数量的蓝色和白色方块。
如果我们现在用 0 表示白色,用 1 表示蓝色,我们得到:
我们可以很快验证
是这个例子的解决方案。
作为约束,我写了以下内容:
sequence_total/6确保值 1 应在行/列中恰好出现 N2 次(N 的一半),并且 3 个元素的指定行/列中的每个序列应包含值 1 的 1 到 2 倍(所以没有 3 个值为 1 的方格可以相邻出现)。
对于 18x18 拼图实例 (*),我得到以下结果:
看起来约束在执行任何搜索之前都做得很好,因为“只”需要 147 个回溯。然而,运行时间对我来说似乎真的很长,尤其是与回溯的数量相比。我猜这是由于必须进行的所有序列检查?更改search/6中的任何选择/选择方法对运行时间几乎没有任何影响这一事实似乎证实了这一点。
如果是这样,是否有任何其他更有效的方法来约束列表/数组中的序列不具有相邻的 N 个相同元素并提高运行时间?
编辑
使用下面@jschimpf 提供的分解版本后,得到如下结果:
新的约束不如 sequence/6 强,我们确实需要更多的回溯,但是我们的运行时间从 10.39 秒下降到了 0.22 秒,因此总体结果非常理想。
样本数据:
用于此问题的谜题(无需回溯即可解决)
问题(p(6,1),[(1,1,0),(1,5,1),(2,2,0),(3,6,0),(4,1,1), (4,4,0),(5,3,1),(5,4,1),(6,2,0),(6,5,1)])。
我发布结果的谜题 (*):
问题(p(18,1),[(1,3,0),(1,9,0),(1,10,0),(1,12,0),(1,14,0), (1,18,1),(2,4,0),(2,7,1),(2,8,1),(3,2,1),(3,6,0),(3 ,16,0),(3,17,0),(4,2,1),(4,4,1),(4,10,1),(4,13,1),(4,18 ,1),(5,8,1),(5,10,1),(5,15,0),(5,16,1),(6,12,1),(7,3,0 ),(7,4,0),(7,6,1),(7,9,0),(7,12,1),(7,17,0),(8,1,1), (8,4,0),(8,8,1),(8,15,1),(8,16,1),(9,7,0),(9,10,0),(9 ,14,0),(10,2,1),(10,4,1),(10,6,1),(10,13,1),(11,7,0),(11,10 ,1),(12,1,1),(12,4,1),(12,7,1),(12,15,1),(12,16,1),(13,1,1 ),(13,6,0),(13,8,1),(13,10,0),(13,16,1),(14,5,1),(14,10,0), (14,13,1),(15,1,1),(15,3,1),(15,12,0),(15,13,1),(15,15,0),(16 ,2,1),(16,4,0),(16,12,0),(16,18,0),(17,9,0),(17,15,0),(17,18 ,0),(18,2,1),(18,8,1),(18,11,1),(18,15,1),(18,16,1)])。
prolog - ECLiPSe CLP:在 ic 库中由 search/6 找到的子结果之间暂停
(这个问题是关于search/6。)
我想知道是否有一种方法 - 而不是手动跟踪 - 每次找到单个变量的新解决方案时暂停执行 search/6?
我想完成此操作以进一步调查在约束模型中搜索期间发生的情况。
例如,如果您正在尝试解决经典的数独问题,并且您已经为您的棋盘编写了一组约束和打印方法,那么在设置约束之后但在搜索之前打印棋盘会很有用,以便评估约束的强度。但是,一旦调用了搜索来解决数独问题,除非您进行跟踪,否则您并不能真正了解在其下构建的单个结果。
如果在以下方面有可能,那将非常有用:
(这只是一个抽象的例子)
现在进行搜索:
clpfd - 分析 ECLiPSe CLP?
我做了两个实现来解决 Shikaku 难题。一个使用 Top,Left,Width 和 Height (TLWH) 作为每个矩形的参数,另一个使用 Top,Left,Bottom,Right (TLBR)。
出于某种原因,使用 TLBR 的速度要快得多,但我不确定为什么。所以我想知道是否有一种方法可以查看在 TLWH 实施中哪些约束需要更长的时间。
有没有办法分析 ECLiPSe CLP 解决方案?
我目前在 Windows 上使用 TkEclipse。