问题标签 [clpfd]

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 投票
2 回答
1420 浏览

prolog - SWI Prolog 不会终止

为什么会?- is_fakt(X)返回结果答案列表,但在获得多个结果答案后它会挂起。我不知道为什么 Prolog 不能返回 X 的所有可能值。

0 投票
4 回答
559 浏览

prolog - 让订单进入谓词解析

查看以下目标(我正在使用 swi-prolog 和 Markus Triska 的 clpfd):

可能的查询如下所示:

我想添加订单或某种解决方案优先级。如果“拒绝”是 的有效响应Input=15,则不应再考虑第二个目标,因此这只是B=decline一个解决方案,而不是B=offer

我知道我可以添加一个!/0,但反过来就行不通了。给我这个谓词的所有可能答案。

考虑到这个例子,aResult=offer应该只适用于Input 0..10,否则应该触发更高的先前下降目标。

当我尝试考虑谓词中的顺序时,我是否认为过于迫切?

0 投票
1 回答
3994 浏览

prolog - 如何以约束满足的方式对爱因斯坦的谜语进行建模(Prolog)

我的 IA 任务是解决爱因斯坦问题。

我必须使用 Prolog 中的 CSP 模型来解决它。我没有给出模型,只有问题和一些输入数据。我的解决方案必须是通用的,我的意思是,对于一些输入数据我必须提供一个解决方案。问题的维度是 N,例如 N 可能是 5(我们有 5 个房子),但它可以变化。

我在 Internet 上找到的许多解决方案都将约束直接放在代码中,但我需要使用输入数据生成它们。该问题必须使用 MAC(维护弧一致性)算法来解决。

我已经阅读了很多关于它的内容(爱因斯坦之谜)。为了实现这个问题,我需要一个问题的表示。

问题是,我不知道如何在 Prolog 中准确地表示问题(我知道基本的 Prolog,没有使用其他库,我们不允许使用 clpfd 库 - prolog clp 求解器)。

我知道我应该从输入(14条线索)+约束说明来自同一组的所有变量(例如国籍)应该不同,我可以实现我的谓词,例如:

例如:

现在,我设法解析了这个输入并获得了一个列表列表:

现在我想我需要使用这个生成的信息来构建一些约束,从我读过的内容来看,使用二进制约束(我认为表示为谓词)是一个好主意,但是我也有一些一元约束,所以我应该怎么做代表约束以包括所有这些?

另一个问题是:如何表示变量(我将在其中获得计算数据),这样我就不需要搜索和修改列表(因为在 prolog 中你不能像在命令式语言中那样修改列表)。

所以我想使用一个变量列表,其中每个变量/元素由一个 3 元组表示:(var, domain, attrV),其中 var 包含变量的当前值,域是一个列表说:[1,2,3,4, .., N], attrV 是对应属性(例如红色)的一个值(N)。一个元素是:(C, [1, 2, 3, 4, 5], red).

其他问题:我应该如何在 prolog 中实现 MAC 算法(使用 AC-3 算法),因为我将有一个元组队列,如果不满足约束,这个队列将被修改,这意味着修改变量列表,以及我应该如何修改 Prolog 中的列表。

任何帮助,将不胜感激!


我尝试使用您上面提供的链接中的 CSP 求解器解决特定版本的问题,但我仍然无法找到解决方案,我想获得解决方案,因为通过这种方式,我会知道如何正确表示通用版本的约束。

添加代码:

0 投票
5 回答
3987 浏览

prolog - Prolog 约束处理 : Packing Squares

我正在尝试解决 prolog 中的约束处理问题。

我需要在 10x10 的网格中打包 4 个 5x5、4x4、3x3 和 2x2 的正方形。它们可能不会重叠。

我的变量如下所示:

其中 X 为 5、4、3 或 2。索引 i 表示行,域表示网格中的列。

我的第一个约束尝试定义正方形的宽度和高度。我这样表述:

这样可能的点就被限制在彼此之间的 X 行和列内。然而,Prolog 停止这些约束并给出以下结果:

所以它停在那里,甚至没有检查其他方格。我的约束很可能太紧了,但我不明白为什么或如何。有什么建议么?

0 投票
4 回答
2547 浏览

prolog - 我很好奇逻辑程序是否可以做代数

我读了一篇关于 Prolog 和逻辑编程的简短文章。我很好奇逻辑程序是否可以做代数。就像你能问方程 5+X = 7 中 X 的变量是什么并得到 -2 的答案吗?

0 投票
1 回答
871 浏览

prolog - 任务计划 sicstus prolog

我最近开始了 sicstus prolog,并有这个作业要使用 CLP(约束逻辑编程)来解决,请帮助我理解问题,我应该寻找什么以及我做错了什么。所以,

某建筑公司:

  • 为了获得原材料,卑诗省必须租用一辆卡车需要 6 天才能运送 25 吨原材料,而且每天的费用为 80 美元。
  • 在地面上建造需要 15 吨原材料,需要 10 天,每层成本 150 美元。
  • 建造地下需要 20 吨原材料,需要 23 天(由于挖掘),成本 150 美元,至少需要一台挖掘机,每天增加 75 美元,挖掘时间减少 3 天(最多两台机器一次时间)。(1->20天,2->17天)
  • 如果租用一台起重机,所有建造时间将减少 25%,费用为每天 120 美元。
  • 电力团队只有在建筑物建成 75% 时才能推进,需要 5 天,每层成本 200 美元。当大楼完工后,还需要一周时间才能完成所有楼层的连接。

BC 假装要建造一个地上 150 层和地下 15 层的摩天大楼,该建筑物必须如何组织才能使利润最大化并缩短所需时间?

将问题定义为约束满足问题并使用 CLP 解决它,以便可以使用不同的参数(或多或少的楼层,或调整团队的清醒时间)来解决它。

到目前为止我所拥有的:

它当然不起作用,因为我不能将累积用于需要 5 个资源的任务,并且 0 个资源的限制是我无法解决的许多问题中的第一个......

0 投票
1 回答
179 浏览

prolog - 使用 CLPFD 求解 CuFrog

好的,所以我有一个叫做 CuFrog 的谜题,它包括在每个位置用一个数字填充一个 3x3x3 的立方体,但是当从一个位置移动到另一个位置时会跳过一个位置。例如,考虑一个扁平的立方体,第 1 侧 (1,1) 右侧的有效位置将是第 1 侧的 (3,1)。

所以我在 Prolog 中使用约束来执行此操作,并且我已经给出了每个变量的域(1 到 54),我已经说过它们必须都是不同的,并且对于每个位置,集合中的一个位置right-left-down-up 必须是该位置的当前值 + 1。

另外,我已经给出了这个谜题的入口点,这意味着我已经将数字 1 放在了第一个位置。

问题是,当我标记变量时,SICStus 没有找到我的答案。:( 看来我一定是在某处遗漏了限制,或者我做错了什么。有人可以帮忙吗?

谢谢。

0 投票
4 回答
6914 浏览

prolog - 如何在 Prolog 中解决密码学难题

我必须编写一个 Prolog 程序来解决一个密码难题。

我需要编写一个函数 solve([A, M, P, D, Y]) 将变量 [A, M, P, D, Y] 分配给从 0 到 9 的值,以便满足等式 AM+PM =天。每个变量被赋予不同的值,A、P、D 不能等于 0。

我开始编写这个函数,但是在运行我的程序时遇到了问题。我将 A、P 和 D 的限制设置为不为零。当我浏览算法时,我意识到 D 必须为 1,所以我在程序的开头定义了它。我为 M 定义了两个不同的变量(M1 和 M2)并将它们设置为彼此相等,因为拼图中的不同 M 应该分配给相同的值。我将位置分配给不同的变量,并根据谜题将它们相加。我解释了任何变量携带进位变量。我的程序编译但函数没有执行。

我究竟做错了什么?我的变量定义有问题吗?我需要定义两个不同的 M 变量,还是一个就足够了?

0 投票
3 回答
1457 浏览

prolog - Prolog - 拉丁方解

我正在尝试在 Prolog 中编写一个程序来找到一个大小为 N 的拉丁方。

我现在有这个:

0 投票
3 回答
461 浏览

prolog - 列表不等式约束

我正在尝试编写一个 Prolog (CLP) 谓词,该谓词将构建一个约束两个列表不等式的约束。

更正式地说,有两个列表A=[A1,...,AN], B=[B1,...,BN],约束被定义为(A1 #\= B1) #\/ (A2 #\= B2) #\/ ... #\/ (AN #\= BN)

给定两个任意长度的列表,我不确定如何构建此约束。这是我的尝试。我明白为什么它不起作用,但无法修复它。