首页 > 解决方案 > 在core.logic中合成满足特征约束的最小地图?

问题描述

core.logic中,有没有办法翻译程序的输出,例如

(run 2 [q]
  (fresh [a]
    (featurec q {:foo a})
    (membero a '(5))
    (conde 
      ((featurec q {:bar 2}))
      ((featurec q {:baz 2})))))

进入满足每个解决方案约束的最小映射,在这种情况下{:foo 5, :bar 2}{:foo 5, :baz 2}

标签: clojurelogic-programmingclojure-core.logicminikanren

解决方案


你可以试试这个,这有点复杂,但它确实有效。

(->> (run 1 [q]
              (fresh [l1 l2 a]
                     (membero a '(5))
                     (emptyo l1)
                     (conso [:foo a] l1 l2)
                     (conso [:bar 2] l2 q)))
         (first)
         (into {}))

或者

(run 1 [q]
         (fresh [a B]
                (membero a '(5))
                (== B 2)
                (== q {:foo a :bar B})))

我相信威廉·伯德可以做得更好。


推荐阅读