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)))))