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


person Alex Lew    schedule 25.09.2018    source источник
comment
Зачем использовать featurec, когда уже известен минимальный набор ключей? Почему не (== q {:foo a :bar 2})?   -  person Taylor Wood    schedule 25.09.2018
comment
В более сложном (потенциально даже рекурсивном) отношении некоторые предложения featurec могут появляться только в некоторых решениях; например, предложения conde, каждое из которых вводит разные ограничения featurec. Я обновил вопрос, чтобы привести пример этого.   -  person Alex Lew    schedule 25.09.2018


Ответы (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 {}))

or

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

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

person akond    schedule 25.09.2018
comment
Спасибо! Проблема с (1) заключается в том, что когда q известно, я хочу иметь возможность запустить это, чтобы вытащить и ограничить соответствующие поля из q, не беспокоясь о порядке, в котором q их хранит (следовательно карта, а не вектор); и, к сожалению, (2) не позволит мне создавать ограничения featurec во всем отношении, потенциально с блокировкой condes некоторых из них. - person Alex Lew; 25.09.2018