我正在努力了解clp(Z)和另一个relational arithmetic system used in MiniKanren之间的功能差异。
特别是clp(Z)显然适用于bounded字段,而Kiselyov et al。被描述为适用于unbounded字段。
[我尝试使用与无穷大和不确定性有关的各种边缘情况,但是除了Kiselyov 等显然不支持区间和负数,我找不到其他明显的区别。
Kiselyov系统的目的/优势是什么?主要是实现更简单,还是还有更多?
好问题!执行关系算术的方法很多,包括CLP(Z),CLP(FD),“ Kiselyov算法”和关系Peano算法。您还可以将算术限制为仅对底数起作用(否则会发出错误信号),或延迟对算术约束的求值,直到关系的自变量变得足够可以确定性地解决该关系为止。
所有这些方法都是有用的,并且它们都有权衡。
我一直在考虑撰写有关此主题的简短论文。如果您有兴趣,也许我们可以一起编写。
为了简要回答您的问题,我们应牢记CLP(Z)和CLP(FD)之间的区别。 “ CLP(X)”代表“在域“ X”上的约束逻辑编程”。 CLP(FD)在整数的有限域(FD)上运行。在CLP(Z)中,域是所有整数的集合,因此大小不受限制。
显然,FD域包含在Z域中,那么为什么要麻烦拥有单独的CLP(FD)域/求解器?因为在受限域内解决问题可能更快或更容易。实际上,在一个域中某些无法确定的问题可能会在受限域中变得可确定。
特别是,clp(Z)显然适用于有界场,而Kiselyov等人。描述为适用于无界字段。
CLP(Z)中的Z域实际上是无界的。 CLP(FD)中的FD域是有界的。在Kiselyov算术中,域是无界的。
Kiselyov数字很有趣,因为一个数字可以表示无数组具体数字。例如,
(0 1 1)
是表示6的Kiselyov数字。(Kiselyov数字是按小尾数顺序排列的二进制数字列表,这就是为什么6以前导'0'而不是前导'1'表示的原因。]
考虑此Kiselyov数字:
`(1 . ,x)
其中x
是一个“新”逻辑变量。该Kiselyov数字表示any正奇整数。这是Kiselyov算法的一个优点:可以对部分实例化的数字执行运算,这些数字表示可能无限多个具体自然数,而无需将(可能无限多个)答案接地。将无限多个自然数表示为一个单一数字有时使我们能够一次推理出无限多个具体数。 las,这仅在以下情况下有效:要表示的基础自然数集可以使用以下形式的Kiselyov数字表示]
`(<bit sequence that doesn't end in 0> . ,x)
Kiselyov算术的一个缺点是每个算术关系都会立即“解决”:如果我们想将两个Kiselyov数相加,然后将结果与另一个Kiselyov数相乘,我们必须首先执行完全加法或完全乘法,然后执行其他操作。相反,CLP(Z)或CLP(FD)求解器可以累积约束,在每个步骤中检查可满足性,并且一旦所有约束都已累积,则仅在计算结束时执行完全求解。这种方法可能更有效,并且还可以在一组约束中发现不一致之处,因为天真的使用Kiselyov算术会产生分歧。
除了Kiselyov等。显然不支持间隔和负数。
Kiselyov算术可以扩展为支持负数,也支持分数/有理数。我怀疑支持间隔也是可行的。 las,我不知道有没有包含这些扩展的库。
[至少,值得一篇简短的文章,在关系算术的不同方法之间还有许多其他折衷!我希望这能给您一些想法。
干杯,
-将