我试图理解为什么以下product-pluso
函数返回意外结果。我发现了一个错误,还是我误解了它是如何工作的?我正在使用带有CLP / FD的core.logic。我还在学习,所以我可能做错了。该函数应该采用两个因子,一个数字和一个总和。总和应该是因子加上数字的乘积。除非两个因素都很新鲜,否则效果很好。然后我得到奇怪的结果。这是在core.logic v0.8.2。
(ns strang-result
(:refer-clojure :exclude [==])
(:use
clojure.test
[clojure.core.logic :exclude [is]])
(:require
[clojure.core.logic.fd :as fd]))
(defn product-pluso [factor1 factor2 number sum]
(fd/eq (= sum (+ number (* factor1 factor2)))))
(run* [x y]
(fd/in x y (fd/interval 1 38))
(product-pluso x y 2 40))
;=> ([1 38] [2 19] [3 13] [4 10] [5 8] [6 7] [7 6] [8 5] [9 5] [10 4] [11 4]
; [12 4] [13 3] [14 3] [15 3] [16 3] [17 3] [18 3] [19 2] [38 1])
答案 0 :(得分:2)
这似乎是一个错误。对于未被检查的fd/+
约束,会发生奇怪的事情。我是首席开发人员之一,我已为此提交了一张票:
http://dev.clojure.org/jira/browse/LOGIC-126
更新:请尝试0.8.3,问题已解决,您应该只看到4个结果。谢谢你的报告。
答案 1 :(得分:0)
您可以使用project
来解决问题,不使用project
它似乎以某种方式对约束进行OR运算,而不是对它们进行AND运算。
(defn product-pluso [factor1 factor2 number sum]
(fresh [product]
(fd/+ product number sum)
(project [product]
(fd/* factor1 factor2 product))))