2013-03-27 79 views
3

我想了解爲什麼以下product-pluso函數返回意外的結果。我發現了一個錯誤,或者我誤解了它的工作原理嗎?我在CLP/FD上使用core.logic。我仍在學習,所以我可能只是做錯了。函數應該採用兩個因子,一個數字和一個和。總和應該是因素加上數字的乘積。它的效果很好,除非這兩個因素都是新鮮的。然後我得到奇怪的結果。 core.logic v0.8.2發生這種情況。Clojure core.logic意外的結果(使用CLP/FD)

(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]) 
+1

爲了澄清,每個[x y]對應乘以38(38 + 2 = 40),但許多不這樣做。 – 2013-03-28 03:07:11

回答

2

這似乎是一個錯誤。 fd/+約束沒有被檢查出現奇怪的情況。我的領先開發商之一,我已經提交了票,這樣的:

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

UPDATE:請嘗試0.8.3,這個問題已經解決了那裏,你會看到只有4個結果。感謝您的報告。

+0

啊,我很高興我沒有做錯什麼。謝謝! – 2013-03-28 17:27:54

+0

@SteveSloan這是一個很好的發現,我很驚訝它沒有出現過。將嘗試在週末進行調查並推出0.8.3版本。 – dnolen 2013-03-28 20:57:52

+0

很好,再次感謝。 – 2013-03-29 20:52:05

0

可以解決使用project問題,沒有project似乎以某種方式或運算約束而不是取與他們。

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