我有一个装箱问题,这个问题与在这篇博客文章中描述和解决的问题有一定的关联。以下是代码,转录时增加了一处
(ns blah
(:require [clojure.core.logic :refer :all :as l]
[clojure.core.logic.fd :as fd]))
(defn productsumo [vars dens sum]
(fresh [vhead vtail dhead dtail product run-sum]
(conde
[(emptyo vars) (== sum 0)]
[(conso vhead vtail vars)
(conso dhead dtail dens)
(project [vhead]
(do (println vhead) succeed)) ;;<--- Just a lame goal that should print out the head..
(fd/* vhead dhead product)
(fd/+ product run-sum sum)
(productsumo vtail dtail run-sum)])))
(defn change [amount denoms]
(let [dens (sort > denoms)
vars (repeatedly (count dens) lvar)]
(run* [q]
;; we want a map from denominations to their quantities
(== q (zipmap dens vars))
;; prune problem space...
;; every var/quantity must be 0 <= n <= amount
(everyg #(fd/in % (fd/interval 0 amount)) vars)
;; the real work
(productsumo vars dens amount))))
user> (change 14 #{1 5 10})
<lvar:81678>
<lvar:81679>
<lvar:81680>
({10 0, 5 0, 1 14} {10 1, 5 0, 1 4} {10 0, 5 1, 1 9} {10 0, 5 2, 1 4})
当运行时,与我预期并通常在调用 project
时所看到的不同,我没有得到 vhead
的投影或当前值,而是得到了 Lvar。有没有任何想法解释为什么会出现这种情况呢?
我的特定用例是对 productsumo 的修改,我有一个键和权重的映射,我需要用它来代替这里的 coll dens
。我的初始方法——看起来是合理的——是像上面一样使用 project
来对基于 vhead
当前值的成本 LVar 进行统一,然后在该计算中使用它。目前我只能得到 LVar 而不是值。
有想法吗?