2012-10-05 15 views
5

は私が[1 4] [1 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 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を削除すると、希望の結果が得られます。基本的には、cの理由でこれらの重複した結果が得られる理由を理解するために、core.logicの置換がどのように機能するのかを理解する必要があります。

このプロセスでは、ベクトルの各要素(membero)がcの場合、検索ツリー内のノードにつながり、結果として重複する結果になります。 c可能な値はcが統一で使用されていないので正しい結果につながります(l/== q [a b])

+0

この回答は正しいです。 cはもっと多くの可能性をもたらしますが、その価値を証明するものではありませんので、繰り返し結果を得ているように見えます。 – dnolen

関連する問題