问题标签 [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 投票
4 回答
1862 浏览

prolog - Prolog 中的可逆数值计算

在阅读 SICP 时,我遇到了逻辑编程第 4.4 章。然后我开始研究 Prolog 编程语言并尝试理解 Prolog 中的一些简单任务。我发现 Prolog 似乎在数值计算方面有问题。

这是标准 Prolog 中阶乘的计算:

我发现的问题是我需要引入两个辅助变量 (CD)、一个新语法 ( is) 并且问题是不可逆的(即f(5,X)按预期工作,但是f(X,120)没有)。

天真地,我希望至少C is A-1, f(C, D)上面可以替换为f(A-1,D),但即使这样也行不通。

我的问题是:为什么我需要在数值计算中而不是在其他查询中做这些额外的“东西”?

我确实理解(SICP 对此非常清楚)一般而言,关于“做什么”的信息不足以回答“如何做”的问题。因此,(至少一些)数学问题中的陈述性知识不足以实际解决这些问题。但这引出了下一个问题:Prolog 中的这些额外“东西”如何帮助我将公式限制在“做什么”足以回答“如何做”的那些问题上?

0 投票
3 回答
1259 浏览

prolog - Prolog 初学者:如何与算术比较运算符统一或如何将一组 var 设置为值范围

我是 Prolog 的新手。我需要编写一个整数加法器,它将 0-9 之间的数字与其他数字 0-9 相加并产生一个解决方案 0-18。这就是我想要做的:

我希望能够这样称呼它:

要检查它是否是有效的添加:

缺少一个变量:

有多个缺失变量:

我意识到这可能是一个非常简单的问题,而且可能非常简单。但是,根据我正在使用的Prolog 教程:

“与统一算术比较运算符不同,运算符不能用于为变量赋值。只有在每边的每个术语都已实例化时才能评估。”

0 投票
3 回答
5068 浏览

prolog - Prolog初学者:如何为谓词中的每个变量创建唯一值

我有一个序言谓词:

我现在想实现AddUnique它将为列表中的所有内容返回唯一值,除非我给它两次变量。


以下是逻辑上等价的内容:

?- AddUnique([A, B, C], 10).相当于:?- Add([A, B, C], 10), A != B, B != C, A != C.

和:

?- AddUnique([A, B, B], 10).相当于:?- Add([A, B, B], 10), A != B.

还:

?- AddUnique([A, B, B], 10).等于?- Add([A, B, B], 10), A != B, B!=B.


如果?- AddUnique([A,B,C,D], 4).给出它应该返回 false,因为它不能带有加到四的唯一正整数。

如果?- AddUnique([A,A,A,A], 4).给出它应该返回A=1


问题:如何A != B, B != C, A != C.在不执行此类操作的情况下移动谓词内的逻辑A != A

0 投票
4 回答
299 浏览

wolfram-mathematica - 寻找 21 变量不等式的界限

我对 21 个变量有以下不等式:

http://pastebin.com/raw.php?i=FTU970Em

当我对此运行“Reduce[ineq,Integers]”时,Mathematica 会挂起很长时间。

这是有道理的:x[1]..x[21] 有许多满足不等式的值集。

我真正想要的只是每个变量的界限(例如,每个 i 的“2 <= x[i] <= 7”)。

我怎样才能通过 Mathematica 有效地得到这个?有没有更好的程序呢?

注意:这是较大项目的一部分:

根据不完整的日志文件部分重新创建类似风险的游戏

整个可怕的不平等列表:http: //pastebin.com/CyX9f70J

在上面运行“Reduce[ineq,Integers]”会产生“false”,所以我可能翻译错误: http ://conquerclub.barrycarter.info/ONEOFF/7460216.html

0 投票
3 回答
4054 浏览

algorithm - 调度程序的算法是什么

我有这个安排任务的问题。每个任务都有一个建议的开始时间 T(它需要从 [T-10, T+10] 开始),需要 L 分钟才能完成并使用许多资源 [R1, R2,...]。当资源被使用时,没有其他任务可以使用它。鉴于只有开始时间是灵活的,我的目标是安排任务,以便他们可以访问他们需要的任何资源或指出所有需要解决的冲突。

我可以为此目的使用哪种算法?谢谢你。

0 投票
2 回答
2099 浏览

prolog - SWI-Prolog 和约束,库 CLP(FD)

我正在使用 clpfd 库处理(swi)序言中的约束。

我试图确定一组约束何时封装或包含另一组,例如 X<4 封装 X<7,因为只要前者为真,后者为真。这可以很容易地用逻辑暗示来表示。但是,我无法让 #==> 运算符给我想要的结果,所以我求助于使用 not(Co1 #/\ #\Co2) ,其中 Co1 和 Co2 是约束。这对于单个约束很好,但是我想将约束的结合传递给 Co1 和 Co2。

现在问题来了。当我尝试

我回来

(奇怪的是,在 Sicstus 中这样做会导致分段错误)

当我通过

我得到了想要的

显然,我不能将后者传递给 not(Co1 #/\ #\Co2),但前者并没有给我想要的结果。谁能解释为什么这两种方法会产生不同的结果,以及如何让前者像后者一样行事?

0 投票
2 回答
463 浏览

java - 统一 - 结果无限

我正在开发(在 Java 中),为了好玩,一个使用统一算法的应用程序。

我选择我的统一算法返回所有可能的统一。例如,如果我尝试解决

添加(X,Y)=成功(成功(0))

它返回

{X = succ(succ(0)), Y = 0}, {X = succ(0), Y = succ(0)}, {X = 0, Y = succ(succ(0))}

然而,在某些情况下,可能存在无限多的统一(例如 X > Y = true)。

有人知道算法允许确定是否可能遇到无限数量的统一吗?

提前致谢

0 投票
4 回答
2095 浏览

prolog - 可逆的“二进制到数字”谓词

以可逆方式将二进制位(例如,它可能是 0/1 的列表)转换为数字的最佳方法是什么?我在 swi 中写了一个本地谓词,但有更好的解决方案吗?最好的祝福

0 投票
3 回答
6464 浏览

prolog - Prolog 中的简单 nth1 谓词

使用 SWI Prolog,有一个谓词可以在名为 nth1 的列表中找到第 n 个项目。我想实现我自己的谓词版本,但是如果您查看清单(nth1)代码,SWI 就非常复杂。有没有更简单的方法呢?

谢谢 :)。

0 投票
5 回答
4576 浏览

prolog - 序言;尝试使斐波那契更有效?

这种逻辑编程真的让我的命令式编程技能跳了起来。这是作业,所以请不要让我回答。这就是我所拥有的:

我想制作另一个看起来像这样的功能;fib(N,Value,LastValue). N是第 n 个数字,value 是返回值。我不明白如何使用累积来重写它。而且由于它倒数,我看不出它如何在计算任何东西之前“知道”最后一个值。:s 任何输入表示赞赏。