core.logic CLP(FD)和ClojureScript

core.logic CLP(FD)和ClojureScript,clojure,logic,clojurescript,clojure-core.logic,Clojure,Logic,Clojurescript,Clojure Core.logic,我试图使用core.logic来找出以下等式的答案: x + y = W x - y = V W和V都是给定的,而x和y是我试图计算的值 我尝试过这样的方法(我用60替换了W,用10替换了V): 但是它返回([“10”NaN])(我希望是35和25) 我该怎么做?我不想使用clojure.core.logic.fd,因为我使用的是ClojureScript-这可能吗?是否可以使用fd 请注意,这些方程只是一个示例。在我的真实场景中,我想解决更类似的问题: x + H + y = W x /

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

x + y = W
x - y = V
W
V
都是给定的,而
x
y
是我试图计算的值

我尝试过这样的方法(我用60替换了
W
,用10替换了
V
):

但是它返回
([“10”NaN])
(我希望是35和25)

我该怎么做?我不想使用
clojure.core.logic.fd
,因为我使用的是ClojureScript-这可能吗?是否可以使用
fd


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

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

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

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中,他解释说“你不能投射出没有被限制为单个值的有限域变量”

为什么不使用逆矩阵来解决这个问题呢?如果它是整数,那么您可以使用Hermite范式。@Andre我评估core.logic的原因之一是为了能够清楚地表达代码中的约束—为了可读性/可维护性。因此,如果,对于给定的问题,我会直观地(使用数学符号)使用两个方程来描述我的问题,我希望能够将这些方程传递给core.logic以获得未知量。明白了,我读到你的最后一句话是“也欢迎解决上述(数学)问题”。很抱歉。
(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)))))