5

これをcore.logicで試しました

(必要 [clojure.core.logic :as l])

(l/ラン* [q]
  (l/フレッシュ [abc]
    (l/membero a [1])
    (l/membero b [4 5])
    (l/membero c [1 2])
    (l/== q [ab]))))

結果が[1 4] [1 5]

しかし、そうでした[1 4] [1 4] [1 5] [1 5]

それから私はそれで遊んで始めて、これを見つけました:

(必要 [clojure.core.logic :as l])

(l/ラン* [q]
  (l/フレッシュ [abc]
    (l/membero a [1])
    (l/membero b [4 5])
    (l/membero c [1 1 1 1 1 1 1 1])
    (l/== q [ab]))))
 ;; => ([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

1 に答える 1

4

これは、論理変数の使い方cが統一されていないためですq。削除cすると、目的の結果が得られます。基本的に、core.logic で置換がどのように機能するかを理解して、なぜこれらの重複した結果が得られるのかを理解する必要がありますc

大まかに言えば、プロセスはツリーを検索して解を求めるようなものです。この場合、ベクトル内の各要素は検索ツリー内のノードmemberoにつながり、可能性のある値cによって導入された各ノードcが正しい結果につながるため、結果が重複します。c統合では使用されないため(l/== q [a b])

于 2012-10-05T05:11:33.120 に答える