我正在尝试使用core.logic
来找出以下等式的答案:
x + y = W
x - y = V
同时给出了{p> W
和V
,而x
和y
是我正在尝试计算的值。
我尝试了类似的方法(我将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
现在我简化了那些以获得最基本的示例运行,但也欢迎上述解决方案:)
答案 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; 。