在core.logic中合成满足特征约束的最小映射?

时间:2018-09-25 07:18:43

标签: clojure logic-programming clojure-core.logic minikanren

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}

1 个答案:

答案 0 :(得分:0)

您可以尝试一下,虽然有点复杂,但确实可以。

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

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