我不确定为什么以下代码在使用-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测试版中的行为。
答案 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])