【问题标题】:Synthesize smallest map satisfying featurec constraints in core.logic?在core.logic中合成满足特征约束的最小地图?
【发布时间】:2018-09-25 07:18:42
【问题描述】:

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}?

【问题讨论】:

  • 当最小密钥集已知时,为什么要使用featurec?为什么不(== q {:foo a :bar 2})
  • 在更复杂的(甚至可能是递归的)关系中,一些featurec 子句可能只出现在某些解决方案中;例如,conde 子句每个都引入不同的 featurec 约束。我已经更新了这个问题来举例说明。

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


【解决方案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})))

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

【讨论】:

  • 谢谢! (1) 的问题是,当 q is 已知时,我希望能够运行它以从 q 中拉出并限制相关字段,而不必担心 @ 的顺序987654325@ 存储它们(因此是地图,而不是矢量);不幸的是,(2)不允许我在整个关系中建立featurec 约束,可能condes 会阻止其中的一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多