2024 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面以了解更多此网站如何运作的信息。

0
core.logic
假设以下代码


(run* [x11 x12 x13
       x21 x22     x24
       x31     x33 x34
           x42 x43 x44]
      (fd/in x11 x12 x13 x21 x22 x24 x31 x33 x34 x42 x43 x44 (fd/interval 1 9))
      (fd/eq (= (+ x11 (/ x12 x13))   5)
           (= (+ x21 (/ x22   2)) x24)
           (= (+ x31 (/   6 x33)) x34)
           (= (+   4 (/ x42 x43)) x44)
           (= (+ x11 (/ x21 x31))   4)
           (= (* x12 (/ x22   6)) x42)
           (= (+ x13 (-   2 x33)) x43)
           (= (+ (-  5 x24) x34)  x44)))


我得到了{{([1 4 1 3 6 6 1 1 7 4 2 6] [2 6 2 4 6 7 2 1 8 6 3 6])}}这样的结果。

然而,当我把{{(fd/interval 1 9)}}改为{{(fd/interval 0 9)}}时,结果变成了一个空序列。然而,我期望它至少包括上述两个解决方案。

5 个答案

0

评论者:dnolen

如果您能在不使用 {{fd/eq}} 的情况下确认这个问题——它只是一个宏糖(macro sugar),这会很有帮助。虽然写出长形式有点繁琐,但它将有助于隔离问题。谢谢。

0

评论者:dnnx

我怀疑这个 Bug 出现在 fd/eq 中。这里有一个更小的测试案例

`
(run* [q]

  (fd/in q (fd/interval 1 2))
  (fd/eq (= (/ q q) 1)))

`

它返回了预期的 (1 2),但是当我将 fd/interval 改为 0 2 时,它会返回一个空序列。

0

评论者:dnolen

谢谢这个最小案例,是的,看起来是 {{fd/eq}} 的问题,因为它如果是手写的话就可以正常工作。

0

评论者:dnolen

参见 LOGIC-156

0
参考: https://clojure.atlassian.net/browse/LOGIC-162 (由 alex+import 报告)
...