2

我试图用来core.logic找出以下等式的答案:

x + y = W
x - y = V

WV都是给定的,而xy是我要计算的值。

我试过这样的方法(我W用 60 和V10 代替):

(logic/run* [q]
          (logic/fresh [x y]
                       (logic/== q [x y])
                       (logic/project [x y]
                                      ; x + y = 60
                                      ; x - y = 10
                                      (logic/== y (- 60 x))
                                      (logic/== x (+ 10 y)))))

但它会返回(["10<lvar:y_6>" NaN])(我希望是 35 和 25)。

我该如何处理?我不想使用clojure.core.logic.fd,因为我正在使用 ClojureScript - 这可能吗?有可能fd吗?


请注意,这些等式只是一个示例。在我的真实场景中,我想解决更多类似的问题:

x + H + y = W
x / y * 100 = V

现在我简化了那些以获得最基本的示例运行,但也欢迎上述解决方案:)

4

1 回答 1

1

core.async的cljs版本还不能解决这种问题,因为fd命名空间还没有从clj版本迁移过来。

使用clojure版本,我们可以这样解决:

(require '[clojure.core.logic :as logic]
         '[clojure.core.logic.fd :as fd])

(logic/run* [q]
  (logic/fresh [x y]
    (logic/== q [x y])
    (fd/in x y (fd/interval 0 100))
    (fd/eq (= 60 (+ x y)))
    (fd/eq (= 10 (- x y)))))

结果:([35 25])

我们不logic/project使用fd/eq来表达 LVar 之间的关系,并将fd/interval它们的值限制在该区间内。

这个答案中,@dnolen 解释说“你不能投影没有被限制为单个值的有限域变量”

于 2015-06-13T00:07:14.753 回答