2012-10-05 51 views
5

我core.logic爲什麼core.logic的輸出會重複相同的值?

 
(require [clojure.core.logic :as l]) 

(l/run* [q] 
    (l/fresh [a b c] 
    (l/membero a [1]) 
    (l/membero b [4 5]) 
    (l/membero c [1 2]) 
    (l/== q [a b]))) 

試過這種預期的結果是[1 4] [1 5]

,但它是[1 4] [1 4] [1 5] [1 5]

然後我就開始擺弄它,發現這個:

 
(require [clojure.core.logic :as l]) 

(l/run* [q] 
    (l/fresh [a b c] 
    (l/membero a [1]) 
    (l/membero b [4 5]) 
    (l/membero c [1 1 1 1 1 1 1 1]) 
    (l/== q [a b]))) 
;; => ([1 4] [1 4] [1 4] [1 5] [1 4] [1 4] [1 5] [1 4] [1 5] [1 4] [1 5] [1 5] [1 5] [1 5]) 

哪裏有是[1 5]穿插[1 4]

發生了什麼事?這是重複的東西應該是一個功能或錯誤?

回答

4

這是因爲邏輯變量c的使用不需要,因爲它不與q統一。如果你刪除c那麼你會得到期望的結果。基本上你需要了解core.logic中的替換是如何工作的,才能理解你爲什麼得到這些重複的結果,因爲c

在高層次上的過程就像是memberoc導致搜索樹中的節點,並導致因爲通過引入每個節點重複結果向量中的每個元素搜索樹的解決方案,在這種情況下, c由於c未用於統一,因此可能的值會導致正確的結果(l/== q [a b])

+0

此答案是正確的。 c提供了更多的可能性,但是我們沒有把它的價值表達出來,所以它看起來好像我們得到了重複的結果。 – dnolen

相關問題