3

我试图理解为什么以下product-pluso函数会返回意外结果。我发现了一个错误还是我误解了它是如何工作的?我正在将 core.logic 与 CLP/FD 一起使用。我还在学习,所以我可能做错了。该函数应采用两个因素,一个数字和一个总和。总和应该是因子加数字的乘积。效果很好,除非这两个因素都是新鲜的。然后我得到奇怪的结果。这发生在 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])
4

2 回答 2

2

这似乎只是一个错误。fd/+未检查的约束发生了一些奇怪的事情。我是主要开发人员之一,我为此提交了一张票:

http://dev.clojure.org/jira/browse/LOGIC-126

更新:请尝试 0.8.3,问题已解决,您应该只看到 4 个结果。感谢您的报告。

于 2013-03-28T17:09:06.933 回答
0

您可以使用 解决问题project,而project不是似乎以某种方式对约束进行 ORing 而不是对它们进行 ANDing。

(defn product-pluso [factor1 factor2 number sum]
  (fresh [product]
         (fd/+ product number sum)
         (project [product]
                  (fd/* factor1 factor2 product)))) 
于 2013-03-28T05:25:35.030 回答