core.logic CLP(FD)与ClojureScript

时间:2015-06-08 14:05:32

标签: clojure logic clojurescript clojure-core.logic

我正在尝试使用core.logic来找出以下等式的答案:

x + y = W
x - y = V
同时给出了{p> WV,而xy是我正在尝试计算的值。

我尝试了类似的方法(我将W替换为60,将V替换为10):

(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

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

1 个答案:

答案 0 :(得分:0)

core.async的cljs版本还无法解决这类问题,因为尚未从clj版本迁移fd命名空间。

使用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来表达LVars之间的关系,而fd/interval则将其值限制在该区间内。

this answer @dnolen解释说&#34;你不能投射那些没有被限制为单一值的有限域变量&#34;