Clojure核心的意外结果.逻辑(使用CLP/FD)



我试图理解为什么以下product-pluso函数返回意想不到的结果。我是否发现了一个bug,还是我误解了这是如何工作的?我用的是core。逻辑与CLP/FD。我还在学习,所以可能是我做错了。这个函数应该包含两个因子,一个数字和一个和。和应该是因子加上数字的乘积。除非两个因素都是新鲜的,否则效果很好。然后我得到奇怪的结果。这就是core。逻辑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])

这看起来只是一个bug。fd/+约束发生了一些奇怪的事情,没有被检查。我是主要开发人员之一,我已经为此提交了一张罚单:

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

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

您可以使用project来解决问题,没有project,它似乎以某种方式绕过约束而不是取消它们。

(defn product-pluso [factor1 factor2 number sum]
  (fresh [product]
         (fd/+ product number sum)
         (project [product]
                  (fd/* factor1 factor2 product)))) 

最新更新