3

次のproduct-pluso関数が予期しない結果を返す理由を理解しようとしています。バグを見つけましたか、それともこれがどのように機能するかを誤解していますか? CLP/FD で core.logic を使用しています。私はまだ勉強中なので、やり方が間違っているかもしれません。この関数は、数値と合計の 2 つの因数を取る必要があります。合計は、係数と数値の積でなければなりません。両方の要素が新鮮でない限り、うまく機能します。その後、奇妙な結果が得られます。これは、core.logic v0.8.2 で発生しています。

(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])
4

2 に答える 2

2

これは単なるバグのようです。fd/+チェックされていない制約で奇妙なことが起こっています。私は主任開発者の 1 人です。これについてチケットを提出しました。

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

更新: 0.8.3 を試してください。問題はそこで解決されており、4 つの結果しか表示されないはずです。ご報告ありがとうございます。

于 2013-03-28T17:09:06.933 に答える
0

を使用して問題を解決できますが、制約をANDするのではprojectなくprojectORするようには見えません。

(defn product-pluso [factor1 factor2 number sum]
  (fresh [product]
         (fd/+ product number sum)
         (project [product]
                  (fd/* factor1 factor2 product)))) 
于 2013-03-28T05:25:35.030 に答える