具有-ve值的Core.logic有限域

时间:2012-11-02 12:43:36

标签: clojure clojure-core.logic

我不确定为什么以下代码在使用-5作为域值

之一时不会返回任何结果
user=> (run* [q] (infd q (domain -5 5)) (*fd q q 25))
()
user=> (run* [q] (infd q (domain 0 5)) (*fd q q 25))
(5)

注意:此代码引用core.logic 0.8.0测试版中的行为。

2 个答案:

答案 0 :(得分:2)

目前对于具有负值的域的core.logic 0.8.0测试版目前没有支持。如果它工作,那完全是偶然的。我不打算在不久的将来亲自努力增加对此的支持,尽管在0.8.0获得适当的发布后,欢迎使用全面的补丁。

答案 1 :(得分:1)

看起来*fd约束的实现仅适用于具有所有正值的域。它基于右侧因子域的上/下边界对产品域的下限/上限的简单划分来计算左侧因子的上限和下限,反之亦然。你可以看到将负面投入混合会导致这种情况无效:

 (run* [q]
   (fresh [r]
     (infd q (domain 1 2 3 4 5))
     (infd r (domain 20 25))
     (*fd q q r)))

 Product = [20..25], RHS = [1..5] => LHS = [20/5..25/1] = [4..25]

 (run* [q]
   (fresh [r]
     (infd q (domain -1 0 1 2 3 4 5))
     (infd r (domain 20 25))
     (*fd q q r)))

 Product = [20..25], RHS = [-1..5] => LHS = [20/5..25/-1] = [4..-25]

由于标志已关闭,因此LHS的间隔不可满足,因为下限大于上限。

具有负值的有限域适用于+fd约束:

 (run* [q] (fresh [a b] (infd a b (domain -1 0 1)) (+fd a b 0) (== q [a b])))
 => ([-1 1] [0 0] [1 -1])