Синтезировать наименьшую карту, удовлетворяющую ограничениям Featurec в 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}?

1 ответ

Вы можете попробовать это, что немного сложно, но это делает работу.

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

Я уверен, что Уильям Берд может сделать лучше.

Другие вопросы по тегам