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}}的情况下有这个问题——这只是宏糖,将长表达式写出来会很繁琐,但可以帮助隔离问题。谢谢。

0

评论者:dnnx

我实际上怀疑错误在 fd/eq 中。这里是一个更小的测试用例

`
(run* [q]

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

`

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

0
by

评论者:dnolen

感谢这个最小化案例,是的,看起来 fd/eq 的确有问题,因为它以长手写成时性能良好。

0
by

评论者:dnolen

另见 LOGIC-156

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