7

fd/distinct要素がではなく有限領域にある場合に使用する利点は何distinctoですか?

以下はすべて戻り([0 1] [1 0])ます。

;;; With distincto
(run* [q]
  (fresh [x y]
    (fd/in x y (fd/interval 1))
      (distincto [x y])
      (== q [x y])))

;;; With fd/distinct
(run* [q]
  (fresh [x y]
    (fd/in x y (fd/interval 1))
      (fd/distinct [x y])
      (== q [x y])))

;;; Without fd at all. 
(let [interval [0 1]]
  (run* [q]
    (fresh [x y]
      (membero x interval)
      (membero y interval)
      (distincto [x y])
      (== q [x y]))))

distincto特に、使用できる場所ならどこでも使用できるように見えますが(ただし、その逆はできません)、とfd/distinctについては同じことが言えません。memberofd/in

4

1 に答える 1

5

fd/distinctdistinctoあらゆる種類の価値を受け取らなければならないよりもはるかに高度に最適化されています。fd/distinct内部では、セットを使用して制約付き変数の効率的な表現を一度に処理し、非常に単純な方法でdistincto不等式演算子を使用します。!=

于 2013-02-20T21:29:25.053 に答える